두 개의 개체 배열 병합
예를 들어 보겠습니다.
var arr1 = new Array({name: "lang", value: "English"},
{name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'},
{name: "lang", value: "German"});
이 두 개의 개체 배열을 병합하고 다음과 같은 배열을 만들어야 합니다.
var arr3 = new Array({name: "lang", value: "German"},
{name: "age", value: "18"},
{name : "childs", value: '5'});
이를 위한 자바스크립트나 jQuery 기능이 있습니까?
$.extend
저한테는 안 어울려요.돌아옵니다
var arr4 = new Array({name : "childs", value: '5'},
{name: "lang", value: "German"});
JavaScript에서 2개의 객체 배열을 병합하려는 경우.이 한 줄 트릭을 사용할 수 있습니다.
Array.prototype.push.apply(arr1,arr2);
예를들면
var arr1 = [{name: "lang", value: "English"},{name: "age", value: "18"}];
var arr2 = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];
Array.prototype.push.apply(arr1,arr2);
console.log(arr1); // final merged result will be in arr1
출력:
[{"name":"lang","value":"English"},
{"name":"age","value":"18"},
{"name":"childs","value":"5"},
{"name":"lang","value":"German"}]
ES6를 사용하면 다음과 같이 매우 쉽게 수행할 수 있습니다.
var arr1 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var arr3 = [...arr1, ...arr2];
출력:
arr3 = [
{"name":"lang","value":"German"},
{"name":"age","value":"18"},
{"name":"childs","value":"5"},
{"name":"lang","value":"German"}
]
현대적인 것들을 실험하는 사람들을 위해:
var odd = [{
name: "1",
arr: "in odd"
},
{
name: "3",
arr: "in odd"
}
];
var even = [{
name: "1",
arr: "in even"
},
{
name: "2",
arr: "in even"
},
{
name: "4",
arr: "in even"
}
];
// ----
// ES5 using Array.filter and Array.find
function merge(a, b, prop) {
var reduced = a.filter(function(aitem) {
return !b.find(function(bitem) {
return aitem[prop] === bitem[prop];
});
});
return reduced.concat(b);
}
console.log("ES5", merge(odd, even, "name"));
// ----
// ES6 arrow functions
function merge(a, b, prop) {
var reduced = a.filter(aitem => !b.find(bitem => aitem[prop] === bitem[prop]))
return reduced.concat(b);
}
console.log("ES6", merge(odd, even, "name"));
// ----
// ES6 one-liner
var merge = (a, b, p) => a.filter(aa => !b.find(bb => aa[p] === bb[p])).concat(b);
console.log("ES6 one-liner", merge(odd, even, "name"));
// Results
// ( stuff in the "b" array replaces things in the "a" array )
// [
// {
// "name": "3",
// "arr": "in odd"
// },
// {
// "name": "1",
// "arr": "in even"
// },
// {
// "name": "2",
// "arr": "in even"
// },
// {
// "name": "4",
// "arr": "in even"
// }
// ]
// for posterity, here's the old skool version
function merge(a, b, prop) {
var reduced = [];
for (var i = 0; i < a.length; i++) {
var aitem = a[i];
var found = false;
for (var ii = 0; ii < b.length; ii++) {
if (aitem[prop] === b[ii][prop]) {
found = true;
break;
}
}
if (!found) {
reduced.push(aitem);
}
}
return reduced.concat(b);
}
2019년 10월 12일 업데이트
타사 라이브러리 없이 새로운 Javascript만을 기반으로 한 새로운 버전입니다.
const mergeByProperty = (target, source, prop) => {
source.forEach(sourceElement => {
let targetElement = target.find(targetElement => {
return sourceElement[prop] === targetElement[prop];
})
targetElement ? Object.assign(targetElement, sourceElement) : target.push(sourceElement);
})
}
var target /* arr1 */ = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
var source /* arr2 */ = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];
mergeByProperty(target, source, 'name');
console.log(target)
이 대답은 점점 낡아가고 있었고, 요즘에는 로다쉬와 언더스코어 같은 립이 훨씬 덜 필요합니다.이 새 버전에서는 대상(arr1) 어레이가 현재 작업 중이며 최신 상태를 유지하고자 하는 어레이입니다.소스(arr2) 어레이는 새 데이터가 생성되는 곳이며 대상 어레이에 병합되기를 원합니다.
소스 배열을 루프하여 새 데이터를 찾고 대상 배열에서 아직 발견되지 않은 모든 개체에 대해 target.push(sourceElement)를 사용하여 해당 개체를 추가합니다. 키 속성('name')을 기준으로 개체가 이미 대상 배열에 있는 경우 Object.assign(targetElement, sourceElement)을 사용하여 속성과 값을 업데이트합니다."대상"은 항상 업데이트된 컨텐츠와 동일한 어레이입니다.
밑줄 또는 lodash를 사용한 이전 답변
저는 항상 구글에서 이곳에 도착하고 항상 답변에 만족하지 못합니다.답변은 좋지만 언더스코어를 사용하면 더 쉽고 깔끔할 것입니다.js
데모: http://jsfiddle.net/guya/eAWKR/
다음은 객체의 속성을 사용하여 두 배열을 병합하는 더 일반적인 함수입니다.이 경우 속성은 'name'입니다.
var arr1 = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
var arr2 = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];
function mergeByProperty(arr1, arr2, prop) {
_.each(arr2, function(arr2obj) {
var arr1obj = _.find(arr1, function(arr1obj) {
return arr1obj[prop] === arr2obj[prop];
});
arr1obj ? _.extend(arr1obj, arr2obj) : arr1.push(arr2obj);
});
}
mergeByProperty(arr1, arr2, 'name');
console.log(arr1);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.core.min.js"></script>
[{name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'}]
ES6 스프레드 연산자를 사용하면 매우 간단합니다.
const array1 = [{a: 'HI!'}, {b: 'HOW'}]
const array2 = [{c: 'ARE'}, {d: 'YOU?'}]
const mergedArray = [ ...array1, ...array2 ]
console.log('Merged Array: ', mergedArray)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
Merged Array: [ {a: 'HI!'}, {b: 'HOW'} {c: 'ARE'}, {d: 'YOU?'} ]
참고: 위의 솔루션은 ES6 스프레드 연산자를 사용하여 두 어레이를 병합하는 것입니다.
2020년 1월 7일 편집 by @bh4r4th : 나의 초기 솔루션 이후 편집으로 인해 문맥이 변경됨에 따라.현재 기준에 맞게 솔루션을 업데이트하고 싶습니다.
중복 개체를 만들지 않고 배열 개체를 병합합니다.
업데이트
value
만약에name
속성이 이전 배열에 이미 있습니다.
const arr1 = [
{ name: "lang", value: "English" },
{ name: "age", value: "18" }
]
const arr2 = [
{ name: "childs", value: '2' },
{ name: "lang", value: "German" }
]
const arr3 = [
{ name: "lang", value: "German" },
{ name: "age", value: "28" },
{ name: "childs", value: '5' }
]
// Convert to key value dictionary or object
const convertToKeyValueDict = arrayObj => {
const val = {}
arrayObj.forEach(ob => {
val[ob.name] = ob.value
})
return val
}
// update or merge array
const updateOrMerge = (a1, a2) => {
const ob1 = convertToKeyValueDict(a1)
const ob2 = convertToKeyValueDict(a2)
// Note: Spread operator with objects used here
const merged_obj = {...ob1, ...ob2}
const val = Object.entries(merged_obj)
return val.map(obj => ({ name: obj[0], value: obj[1] }))
}
const v1 = updateOrMerge(arr1, arr2)
const v2 = updateOrMerge(v1, arr3)
console.log(`Merged array1 and array2: ${JSON.stringify(v1)} \n\n`)
console.log(`Merged above response and array3: ${JSON.stringify(v2)} \n\n`)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
var arr3 = [];
for(var i in arr1){
var shared = false;
for (var j in arr2)
if (arr2[j].name == arr1[i].name) {
shared = true;
break;
}
if(!shared) arr3.push(arr1[i])
}
arr3 = arr3.concat(arr2);
두 어레이 병합:
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var result=arr1.concat(arr2);
// result: [{name: "lang", value: "English"}, {name: "age", value: "18"}, {name : "childs", value: '5'}, {name: "lang", value: "German"}]
'name'에 대한 중복 값 없이 두 어레이 병합:
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var i,p,obj={},result=[];
for(i=0;i<arr1.length;i++)obj[arr1[i].name]=arr1[i].value;
for(i=0;i<arr2.length;i++)obj[arr2[i].name]=arr2[i].value;
for(p in obj)if(obj.hasOwnProperty(p))result.push({name:p,value:obj[p]});
// result: [{name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'}]
가장 쉬운 방법은 ES6 마법을 사용하는 것입니다.
두 개를 중복 항목과 병합:
const a = [{a: 1}, {b: 2}]
const b = [{a: 1}]
const result = a.concat(b) // [{a: 1}, {b: 2}, {a: 1}]
중복이 없는 경우 위의 플러스와 동일합니다.
const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]
두 어레이를 중복으로 병합한 다음 이 답변을 사용하여 중복을 제거합니다.이것은 지름길처럼 보입니다.
const arr1 = [{
name: "lang",
value: "English"
},
{
name: "age",
value: "18"
}
];
const arr2 = [{
name: "childs",
value: '5'
},
{
name: "lang",
value: "German"
}
];
const mergedArray = [...arr1, ...arr2];
const uniqueData = [...mergedArray.reduce((map, obj) => map.set(obj.name, obj), new Map()).values()];
console.log(uniqueData)
로다쉬 포함:
_.uniqBy([...arr1, ...arr2], 'name')
그러나 다음을 사용하는 다른 버전:
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var arr = arr1.concat(arr2).reduce(function(prev, current, index, array){
if(!(current.name in prev.keys)) {
prev.keys[current.name] = index;
prev.result.push(current);
}
else{
prev.result[prev.keys[current.name]] = current;
}
return prev;
},{result: [], keys: {}}).result;
document.getElementById("output").innerHTML = JSON.stringify(arr,null,2);
<pre id="output"/>
ES6 맥락에서 유사한 문제를 해결한 방법은 다음과 같습니다.
function merge(array1, array2, prop) {
return array2.map(function (item2) {
var item1 = array1.find(function (item1) {
return item1[prop] === item2[prop];
});
return Object.assign({}, item1, item2);
});
}
참고: 이 접근 방식은 배열 2에 나타나지 않는 배열 1의 항목을 반환하지 않습니다.
편집: 두 번째 배열에 나타나지 않는 항목을 보존하고 싶은 몇 가지 시나리오가 있어서 다른 방법을 생각해 냈습니다.
function mergeArrays(arrays, prop) {
const merged = {};
arrays.forEach(arr => {
arr.forEach(item => {
merged[item[prop]] = Object.assign({}, merged[item[prop]], item);
});
});
return Object.values(merged);
}
var arr1 = [
{ name: 'Bob', age: 11 },
{ name: 'Ben', age: 12 },
{ name: 'Bill', age: 13 },
];
var arr2 = [
{ name: 'Bob', age: 22 },
{ name: 'Fred', age: 24 },
{ name: 'Jack', age: 25 },
{ name: 'Ben' },
];
console.log(mergeArrays([arr1, arr2], 'name'));
바닐라 js를 사용하여 jsut(ES6 버전)
// no need new Array constructor, just using an array literal
const arr1 = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
const arr2 = [{name: "childs", value: '5'}, {name: "lang", value: "German"}];
// 1. create a map
const map = new Map();
// 2. concat array
// arr1.concat(arr2) === [...arr1, ...arr2]
const arr3 = [...arr1, ...arr2];
// 3. for ... of, iterator array
for(const obj of arr3) {
if(!map.has(obj.name)) {
// add
map.set(obj.name, obj);
} else {
// update
map.set(obj.name, {
...map.get(obj.name),
...obj,
});
}
}
// 4. get new merged unqiue array
const arr4 = [...map.values()];
console.log(`result array =`, JSON.stringify(arr4, null, 4));
/*
result array = [
{
"name": "lang",
"value": "German"
},
{
"name": "age",
"value": "18"
},
{
"name": "childs",
"value": "5"
}
]
*/
검정 ✅ (크롬)
참조
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for ...의
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#array_literals
간단한 해결책
var tx = [{"id":1},{"id":2}];
var tx1 = [{"id":3},{"id":4}];
var txHistory = tx.concat(tx1)
console.log(txHistory);
// output
// [{"id":1},{"id":2},{"id":3},{"id":4}];
개체를 사용하여 중복 항목을 교체하는 동안 속성을 수집한 다음 해당 개체를 다시 배열로 확장/플랫할 수 있습니다.이와 같은 것:
function merge(args) {
args = Array.prototype.slice.call(arguments);
var o = { };
for(var i = 0; i < args.length; ++i)
for(var j = 0; j < args[i].length; ++j)
o[args[i][j].name] = args[i][j].value;
return o;
}
function expand(o) {
var a = [ ];
for(var p in o)
if(o.hasOwnProperty(p))
a.push({ name: p, value: o[p]});
return a;
}
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var arr3 = expand(merge(arr1, arr2));
이 방법이 가장 빠른 방법인지는 모르겠지만 여러 입력 어레이에 적용됩니다. 예를 들어 다음과 같습니다.
var a = expand(
merge(
[{name: "lang", value: "English"}, {name: "age", value: "18"}],
[{name: "childs", value: '5'}, {name: "lang", value: "German"}],
[{name: 'lang', value: 'Pancakes'}]
)
);
에서 동일한 기능을 제공합니다.a
은 있던에안에 .arr3
"독일어"가 "팬케이크"로 대체되었습니다.
이 접근 방식은 객체가 모두 동일하다고 가정합니다.{name: ..., value: ...}
당연한 거죠.
여기에서 작동하는 것을 볼 수 있습니다(콘솔을 여십시오).http://jsfiddle.net/ambiguous/UtBbB/
JS Map을 활용한 솔루션:
const merge = (arr1, arr2, prop) => {
const resultMap = new Map(arr1.map((item) => [item[prop], item]));
arr2.forEach((item) => {
const mapItem = resultMap.get(item[prop]);
if (mapItem) Object.assign(mapItem, item);
else resultMap.set(item[prop], item);
});
return [...resultMap.values()];
};
const arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
const arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
console.log(merge(arr1, arr2, "name"));
다음을 생성하는 요소:
당신은 다음 기능을 사용할 수 있습니다.
const merge = (a, b, key = "id") =>
a.filter(elem => !b.find(subElem => subElem[key] === elem[key]))
.concat(b);
그리고 해보세요
merge(arr1, arr2, 'name');
jQuery Merge는 어떻습니까?
http://api.jquery.com/jQuery.merge/
jsFiddle 예제: http://jsfiddle.net/ygByD/
저는 같은 문제에 직면하고 있었고, 그에 대한 답변을 바탕으로 언더스코어 라이브러리를 확장하고 필요한 기능을 조금 더 추가했습니다.여기 요지가 있습니다.
/**
* Merges two object-like arrays based on a key property and also merges its array-like attributes specified in objectPropertiesToMerge.
* It also removes falsy values after merging object properties.
*
* @param firstArray The original object-like array.
* @param secondArray An object-like array to add to the firstArray.
* @param keyProperty The object property that will be used to check if objects from different arrays are the same or not.
* @param objectPropertiesToMerge The list of object properties that you want to merge. It all must be arrays.
* @returns The updated original array.
*/
function merge(firstArray, secondArray, keyProperty, objectPropertiesToMerge) {
function mergeObjectProperties(object, otherObject, objectPropertiesToMerge) {
_.each(objectPropertiesToMerge, function (eachProperty) {
object[eachProperty] = _.chain(object[eachProperty]).union(otherObject[eachProperty]).compact().value();
});
}
if (firstArray.length === 0) {
_.each(secondArray, function (each) {
firstArray.push(each);
});
} else {
_.each(secondArray, function (itemFromSecond) {
var itemFromFirst = _.find(firstArray, function (item) {
return item[keyProperty] === itemFromSecond[keyProperty];
});
if (itemFromFirst) {
mergeObjectProperties(itemFromFirst, itemFromSecond, objectPropertiesToMerge);
} else {
firstArray.push(itemFromSecond);
}
});
}
return firstArray;
}
_.mixin({
merge: merge
});
그것이 유용하기를 바랍니다!잘 부탁드립니다!
저는 최근에 이 문제로 어려움을 겪었고 답을 얻기를 희망하며 여기에 왔지만 받아들여진 답은 제가 선호하지 않는 루프에 2를 사용합니다.저는 마침내 제 것을 만들 수 있었습니다.어떤 라이브러리에도 의존하지 않습니다.
function find(objArr, keyToFind){
var foundPos = objArr.map(function(ob){
return ob.type;
}).indexOf(keyToFind);
return foundPos;
}
function update(arr1,arr2){
for(var i = 0, len = arr2.length, current; i< len; i++){
var pos = find(arr1, arr2[i].name);
current = arr2[i];
if(pos !== -1) for(var key in arr2) arr1[pos][key] = arr2[key];
else arr1[arr1.length] = current;
}
}
이것은 또한 arr1의 순서를 유지합니다.
var arr1 = [{ name: "lang", value: "English" }, { name: "age", value: "18" }];
var arr2 = [{ name: "childs", value: '5' }, { name: "lang", value: "German" }];
function mergeArrayByProperty(arr1, arr2, prop) {
var newArray =
arr1.map(item => {
if (typeof (item[prop]) !== "undefined") {
var nItems = arr2.filter(ni => { if (typeof (ni[prop]) !== "undefined" && ni[prop] === item[prop]) return ni; });
if (nItems.length > 0) {
item = Object.assign({}, item, nItems[0]);
}
return item;
}
});
var arr2nd = arr2.flatMap(item => { return item[prop] });
var arr1nd = arr1.flatMap(item => { return item[prop] });
var nonDupArr = arr2nd.map(p => { if (arr1nd.includes(p) === false) return arr2.filter(i2 => { if (i2[prop] === p) return Object.assign({}, i2) })[0]; });
return newArray.concat(nonDupArr).filter(i=>{if(i !== null)return i})
}
var arr = mergeArrayByProperty(arr1, arr2, 'name');
console.log(arr)
첫 번째 배열에서 중복 키를 찾고 키 값이 같은 두 번째 배열 개체를 병합합니다.두 번째 배열에 값이 없으면 원래 개체를 사용합니다.보시다시피 lang은 결과 집합에서 한 번만 발견되며 값은 독일어입니다.
- 인 존제사를 합니다.
for
모양의
const merge = (first, second) => {
for(let i=0; i<second.length; i++) {
first.push(second[i]);
}
return first;
}
console.log(merge([1,2,3], [4,5,6])); // [1,2,3,4,5,6]
console.log(merge(merge([1,2,3], [4,5,6]), [7,8,9])); // [1,2,3,4,5,6,7,8,9]
-
Spread
입니다.
const arr1 = [1,2,3];
const arr2 = [4,5,6];
// Merge arrays
const merged = [...arr1, ...arr2];
console.log(merged); // [1,2,3,4,5,6]
-
concat()
방법
const arr1 = [1,2,3];
const arr2 = [4,5,6];
// Merge arrays
const merged1 = arr1.concat(arr2); // bit confusing, seems like `arr1` itself is being modified but it's not
const merged2 = [].concat(arr1, arr2); // cleaner approach
console.log(merged1); // [1,2,3,4,5,6]
console.log(merged2); // [1,2,3,4,5,6]
-
push()
방법
const arr1A = [1,2,3];
const arr2A = [4,5,6];
const arr1B = [1,2,3];
const arr2B = [4,5,6];
const arr1C = [1,2,3];
const arr2C = [4,5,6];
const arr3C = [7,8,9];
// Merge arrays
const merged1 = arr1A.push(...arr2A);
// Merging without the ... on arr2B
const merged2 = arr1B.push(arr2B);
// Merge more than two arrays
arr1C.push(...[...arr2C, ...arr3C]);
console.log(arr1C); // [1,2,3,4,5,6,7,8,9]
console.log(merged1); // 6
console.log(arr1A); // [1,2,3,4,5,6]
console.log(arr2A); // [4,5,6]
console.log(merged2); // 4
console.log(arr1B); // [1,2,3,[4,5,6]]
console.log(arr2B); // [4,5,6]
-
reduce()
방법
const arr1 = [1,2,3];
const arr2 = [4,5,6];
const merged = arr2.reduce((arr, item) => {
arr.push(item);
return arr;
}, arr1);
console.log(merged); // [1,2,3,4,5,6]
요약하자면,
- JavaScript에서 두 개 이상의 배열을 하나로 병합하는 방법은 여러 가지가 있습니다.
-
spread
오이터또는레퍼.concat()
방법이 가장 최적의 솔루션입니다. - 병합할 모든 입력이 배열인 것이 확실하면 스프레드 연산자를 사용합니다.확실하지 않은 경우에는 다음을 사용합니다.
concat()
방법. - 당신은 할 수 .
push()
병합할 입력 배열 중 하나를 변경하려는 경우 배열을 병합하는 방법입니다. -
reduce()
어레이를 병합하는 방법은 약간 오버헤드가 있습니다.
자세한 내용은 여기에 있는 자세한 블로그와 여기에 있는 비디오를 참조하십시오.
즉석에서 - jquery extend를 시도해 보세요.
var arr3 = jQuery.extend(arr1,arr2....)
저먼필합다니링터다▁filter를 필터링합니다.arr1
요기여하초소에 존재하는 으로 합니다.arr2
그렇지 않으면.이 파일이 있으면 결과 배열에 추가하지 않고 추가합니다.그리고 난 다음에 덧붙이자면arr2
결과적으로
arr1.filter(item => {
if (!arr2.some(item1=>item.name==item1.name)) {
return item
}
}).concat(arr2)
let mergeArray = arrA.filter(aItem => !arrB.find(bItem => aItem.name === bItem.name))
이전 답변과 달리 이 답변은 일반적이기 때문에 O(n) 외부 라이브러리가 실제로 중복을 걸러내고 OP가 요청하는 순서를 유지합니다(첫 번째 모양 대신 마지막 일치 요소를 배치함으로써).
function unique(array, keyfunc) {
return array.reduce((result, entry) => {
const key = keyfunc(entry)
if(key in result.seen) {
result.array[result.seen[key]] = entry
} else {
result.seen[key] = result.array.length
result.array.push(entry)
}
return result
}, { array: [], seen: {}}).array
}
용도:
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"})
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"})
var arr3 = unique([...arr1, ...arr2], x => x.name)
/* arr3 == [
{name: "lang", value: "German"},
{name: "age", value: "18"},
{name: "childs", value: "5"}
]*/
const arr1 = [{ name: "lang", value: "English" }, { name: "age", value: "18" }];
const arr2 = [{ name: "childs", value: '5' }, { name: "lang", value: "German" }];
const mergeArrOfObjects = (dataset1, dataset2) => {
const map1 = new Map();
dataset1.map((d1, i) => {
map1.set(d1.name, i);
})
for (let d2 of dataset2) {
if (d2 && map1.has(d2.name)) {
dataset1[map1.get(d2.name)] = d2;
} else if(d2){
dataset1.push(d2);
}
}
return dataset1;
};
const arr3 = mergeArrOfObjects(arr1, arr2);
console.log(arr3);
그냥 helprjs를 사용하세요.
const arr1 = [{ id: 1, name: 'Jack'}, { id: 2, name: 'Jack'}];
const arr2 = [{ id: 2, name: 'Jane'}, { id: 3, name: 'Rod'}];
mergeArrays(arr1, arr2, "name");
// [{ id: 1, name: 'Jack'}, { id: 2, name: 'Jane'}, { id: 3, name: 'Rod'}];
mergeArrays(arr1, arr2, "id");
// [{ id: 1, name: 'Jack'}, { id: 2, name: 'Jack'}, { id: 3, name: 'Rod'}];
데모를 확인하십시오.
질문에 따르면, 저는 다음과 같은 것이 있는 것으로 알고 있습니다.key
다른 특성을 병합하는 것이 아니라 재정의하는 데 사용할 수 있습니다.
interface Foo {
name: string;
value: string;
}
var arr1: Foo[] = [
{ name: "lang", value: "English" },
{ name: "age", value: "18" },
];
var arr2: Foo[] = [
{ name: "childs", value: "5" },
{ name: "lang", value: "German" },
];
다음의 조합을 사용할 수 있습니다.Map
와 함께Reduce
선하기위해를 key
레코드를 덮어쓰는 데 사용됩니다.
const merged: Foo[] = Array.from(
[...arr1, ...arr2].reduce(
(acc, curr) => acc.set(curr.name, curr),
new Map<Foo["name"], Foo>(),
)
.values(),
);
// [
// { name: "lang", value: "German" },
// { name: "age", value: "18" },
// { name: "childs", value: "5" },
// ];
var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);
언급URL : https://stackoverflow.com/questions/7146217/merge-2-arrays-of-objects
'programing' 카테고리의 다른 글
스토리보드에서 간단한 둥근 단추를 만드는 방법은 무엇입니까? (0) | 2023.05.24 |
---|---|
사용자 컨트롤의 데이터 컨텍스트 (0) | 2023.05.24 |
도커 엔진과 도커 컨테이너가 작동하는지 확인하는 방법은 무엇입니까? (0) | 2023.05.24 |
DateTime에서 AM/PM 값을 가져오려면 어떻게 해야 합니까? (0) | 2023.05.24 |
UI 보기에 터치 이벤트를 추가하는 방법은 무엇입니까? (0) | 2023.05.19 |