2 개의 객체 배열 병합


112

예를 살펴 보겠습니다.

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

이 두 개체 배열을 병합하고 다음 배열을 만들어야합니다.

arr3 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'});

이를 수행하는 JavaScript 또는 jQuery 함수가 있습니까?

$.extend나에게 적합하지 않습니다. 그것은 반환

arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

15
무슨 일 {name: "lang", value: "English"}이야?
Shadow Wizard is Ear For You

죄송합니다. $ .merge가 아니라 $ .extend를 멘션합니다.
Alexander

1
관련된 논리는 무엇입니까? 어레이를 어떻게 병합 하시겠습니까? 귀하의 예에서 명확하지 않습니다.
Shadow Wizard is Ear For You

대단히 감사합니다. 나는 그것을 수동으로했다.
Alexander 알렉산더

6
@ShadowWizard, OP가 의미하는 바는 존재하는 경우 업데이트하고 그렇지 않은 경우 푸시라고 생각합니다.
Amin Mohamed Ajani

답변:


84

JavaScript에서 두 개의 객체 배열을 병합하려는 경우. 이 한 줄 트릭을 사용할 수 있습니다.

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"}]

이것은 지금까지 가장 간단한 사용이며 잘 작동합니다. 공유해 주셔서 감사합니다.
레오 Caseiro

17
훨씬 단순한 결과와 동일한 결과 :arr1 = arr1.concat(arr2)
keithpjolley

7
그러나 이것은 병합이 아닙니다!
디미트리 Kopriwa

1
결과는 동일하지 않습니다. concat새 배열을 반환하고 보유한 모든 참조를 중단합니다.
Bpainter

8
이것은 질문에 대한 답이 아닙니다. 결과 배열에는 4 개가 아닌 3 개의 객체가 있어야합니다. 샘플 값을 변경했습니다. 기본적으로 OP가 원하는 것은 두 개의 객체 배열을 병합하고 중복 값을 제거하는 것입니다.
란잔

43

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"}
    ]

6
이것이 최고의 답변이어야합니다.
nocdib

20
이것은 OP가 찾고 있던 것을 수행하지 않습니다. 포함 된 두 번째 개체가 있어서는 안됩니다{ name: 'lang', value: 'German'}
Will

3
이 답변이 투표 된 이유를 모르겠습니다. @ daveanderson88이 원하는 것은이 대답과 다릅니다.
Nguyễn Xuân Hoàng

33

현대적인 것을 실험하는 사람들을 위해 :

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"
//     }
// ]

29

업데이트 2019 년 10 월 12 일

새로운 자바 스크립트만을 기반으로하고 타사 라이브러리가 필요없는 새 버전입니다.

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)

이 대답은 점점 늙어 가고 있었고 lodash 및 underscore와 같은 libs는 요즘 훨씬 덜 필요합니다. 이 새 버전에서 대상 (arr1) 배열은 우리가 작업하고 있으며 최신 상태로 유지하려는 배열입니다. 소스 (arr2) 배열은 새 데이터 의 출처 이며 대상 배열에 병합하려고합니다 .

우리 오버 루프 소스 새 데이터를 찾고 배열, 아직 우리에없는 모든 개체에 대한 대상 배열 우리는 단순히 그 객체 사용하여 추가 target.push (sourceElement) 우리를 기반으로하는 경우, 키 속성 ( '이름') , object는 이미 대상 배열에 있습니다. Object.assign (targetElement, sourceElement)를 사용하여 속성과 값을 업데이트합니다 . 우리의“타겟”은 항상 동일한 배열이며 업데이트 된 내용을 포함합니다.


밑줄 또는 lodash를 사용하는 이전 답변

나는 항상 Google에서 여기에 도착하고 항상 답변에 만족하지 않습니다. 대답은 좋지만 underscore.js를 사용하면 더 쉽고 깔끔 할 것입니다.

데모 : http://jsfiddle.net/guya/eAWKR/

다음은 객체의 속성을 사용하여 2 개의 배열을 병합하는보다 일반적인 함수입니다. 이 경우 속성은 '이름'입니다.

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'}]

6
LOC에서 @YOU의 대답과 거의 동일하지만 훨씬 더 느립니다 (대부분 추가 ​​함수 호출과 YOU의 대답이 JS 연관 배열 트릭을 사용하여 O (1) 조회로 항목을 찾는다는 사실). 이것은 추가 도서관을 가져와야한다는 사실 외에 있습니다.
Mrchief

극단적 인 경우를 다루지 않는 한 성능에 차이가 없습니다. 여분의 lib와 관련하여-밑줄, lodash 등은 일반적으로 이미 사용되고 있으며 다른 이점이 있으므로 어쨌든 사용을 고려해야합니다. 대부분의 개발자와 앱은이 솔루션의 단순성과 일반성의 이점을 누릴 수 있습니다.
guya

1
@guya 나는 이것이 오래되었지만 밑줄, lodash 등은 일반적으로 이미 사용되고 있으며 다른 이점이 있지만 다른 이점 이 있다고 말하면 일반적으로 이미 사용되었다고 말하는 엄청난 가정입니다.
Craicerjack

26
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);

여기에 이미지 설명 입력


1
이 답변은 시간 복잡도가 좋지 않습니다 (O (n ^ 2)). 해시 맵을 사용하여 O (n) 솔루션이 가능합니다.
Alex von Brandenfels 19

18

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 스프레드 연산자를 사용하여 두 배열을 병합하는 것입니다.

@ bh4r4th에 의해 2020 년 1 월 7 일 편집 : 내 초기 솔루션 이후 편집으로 인해 컨텍스트가 변경됨에 따라. 현재 기준과 일치하도록 솔루션을 업데이트하고 싶습니다. 즉,

  1. 중복 객체를 생성하지 않고 배열 객체를 병합하고,

  2. 속성이 이전 배열에 이미 있는 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>


1
이것은 2019 년에 받아 들여진 대답이어야합니다! 득표 수가 많은 다른 답변을보고 같은 해결책을 제안하려고 했어요! @Alexander 놓치기 쉽지만 이것을 받아들이십시오!
iaforek

틀 렸습니다. 질문자는 단순히 추가하는 것이 아니라 중복 속성이있는 경우 개체를 REPLACE하려고합니다.
HaveSpacesuit

@HaveSpacesuit을 지적 해 주셔서 감사합니다. 컨텍스트가 두 배열을 병합하는 것이 2018 년에이 질문에 답했습니다. set병합시 중복을 제거 하기 위해 사용하도록 곧이 답변을 편집합니다 . 이것은 새로운 변수 인수를 생성하지만 최소한의 코드를 만듭니다. 그러나 나는 이름이 속성으로 정의되고 값이 다른 유형으로 정의 된 페이로드의 열렬한 팬이 아닙니다. 대신 나는 선호한다 [ { lang: &#39;German&#39;, age: 25}] . 이렇게하면 서비스간에 통신하는 동안 페이로드 가중치가 최소화됩니다.
bh4r4th

이제 질문의 변경된 컨텍스트와 일치하도록 솔루션을 업데이트했습니다.
bh4r4th

16

두 배열 병합 :

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'}]

Array.concat은 2 개의 배열을 하나로 병합하는 적절한 방법입니다. 또한 "진정한"병합 개념이 (각 배열 요소의 주어진 키를 기반으로) 해결되었다는 확장 된 가정을 좋아합니다.

14

가장 쉬운 방법은 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))]


1
다른 본성의 항목이 작동하지 않습니다 CONCAT는
fdsfdsfdsfds

7

lodash와 함께 :

_.uniqBy([...arr1, ...arr2], 'name')

ES6 구문은 2 개의 객체 배열이 아니라 2 개의 배열로 작동합니다.
Dario

7

이것이 내가 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);
    });
}

참고 :이 접근 방식은 array2에 나타나지 않는 array1의 항목을 반환하지 않습니다.


편집 : 두 번째 배열에 나타나지 않는 항목을 보존하려는 시나리오가 있으므로 다른 방법을 생각해 냈습니다.

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'));

6

다음을 사용하는 또 다른 버전 reduce() method:

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"/>


이것은 나를 위해 잘 작동했습니다. 하지만 한 가지 작은 문제는 3 개의 큰 json 객체를 병합 할 때 순서가 가끔 이상
하다는 것입니다

5

간단한 솔루션

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}];

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/



2

나는 같은 문제에 직면했고 guya 대답을 기반으로 밑줄 라이브러리를 확장하고 필요한 기능을 조금 더 추가했습니다. 여기에 요점이 있습니다.

/**
 * 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

나는 최근 에이 문제로 어려움을 겪었고 대답을 원했지만 수락 된 대답은 내가 선호하지 않는 2 for in 루프를 사용합니다. 나는 마침내 내 자신을 만들 수 있었다. 어떤 라이브러리에도 의존하지 않습니다.

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의 순서를 유지합니다.


2

다음 기능을 사용할 수 있습니다.

const merge = (a, b, key = "id") =>
  a.filter(elem => !b.find(subElem => subElem[key] === elem[key]))
   .concat(b);

그리고 시도

merge(arr1, arr2, 'name');

ES6 불변 기능을 가진 Diago 방식 덕분에```export const mergeArrays = (a1, a2, key = "id") => a1 && a2! = null? [... a1.filter (a =>! a2.find (p => p [key] === a [key])), ... a2] : null; ```
Musa

1

여기에서는 먼저 arr1존재 여부를 기준으로 필터링 arr2합니다. 존재하는 경우 결과 배열에 추가하지 마십시오. 그렇지 않으면 추가하십시오. 그런 다음 arr2결과에 추가 합니다.

arr1.filter(item => {
  if (!arr2.some(item1=>item.name==item1.name)) {
    return item
  }
}).concat(arr2)

답변에 대한 설명을 친절하게 제공하십시오. 따라서 다른 사람이 질문과 답변을 읽으면 쉽게 이해할 수 있습니다.
Mittal Patel

이 답변은 정확하고 유용 할 수 있지만 문제 해결에 도움이되는 방법을 설명하기 위해 몇 가지 설명을 함께 포함하는 것이 좋습니다. 이것은 작동을 멈추게하는 변경 (아마도 관련이없는)이 있고 사용자가 한 번 작동 한 방식을 이해해야하는 경우에 특히 유용합니다.
Erty Seidohl

감사합니다. 솔루션 설명을 업데이트했습니다. 이 보인다면 정확한 PLS는 :) upvote에
maulik 밧

0

내 머리 꼭대기에서 -jquery extend를 시도하십시오.

var arr3 = jQuery.extend(arr1,arr2....)

죄송합니다. 정확히이 함수는 arr4를 반환합니다. $ .merge가 아닙니다. 마지막 것은 객체를 복제하기 때문에 나에게도 적합하지 않습니다.
Alexander

0

var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);


나는 이것이 Array.protype.push.apply()대답 보다 훨씬 더 합리적이라는 데 동의 하지만 OP가 원하는 것처럼 병합을 수행하지 않습니다.
keithpjolley

객체의 병합 배열이 두 개인 경우 'concat'을 사용하여 위의 출력을 얻을 수 없습니다. 이것을 확인하십시오 jsfiddle.net/jahanzaibaslam/z22n5tuo
Jahanzaib Aslam

0

@YOU의 답변을 기반으로하지만 순서를 유지합니다.

var arr3 = [];
for(var i in arr1){
   var shared = false;
   for (var j in arr2)
       if (arr2[j].name == arr1[i].name) {
           arr3.push(arr1[j]
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr1[i])
}

for(var j in arr2){
   var shared = false;
   for (var i in arr1)
       if (arr2[j].name == arr1[i].name) {
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr2[j])
}
arr3

이 솔루션이 덜 효율적이라는 것을 알고 있지만 주문을 유지하고 개체를 계속 업데이트하려면 필요합니다.


0

다음은 키로 두 개의 객체 배열을 병합하기 위해 작성한 jQuery 플러그인입니다. 이렇게하면 대상 배열이 제자리에서 수정됩니다.

(function($) {
  $.extendObjectArray = function(destArray, srcArray, key) {
    for (var index = 0; index < srcArray.length; index++) {
      var srcObject = srcArray[index];
      var existObject = destArray.filter(function(destObj) {
        return destObj[key] === srcObject[key];
      });
      if (existObject.length > 0) {
        var existingIndex = destArray.indexOf(existObject[0]);
        $.extend(true, destArray[existingIndex], srcObject);
      } else {
        destArray.push(srcObject);
      }
    }
    return destArray;
  };
})(jQuery);

var arr1 = [
  { name: "lang",   value: "English" },
  { name: "age",    value: "18"      }
];
var arr2 = [
  { name: "childs", value: '5'       },
  { name: "lang",   value: "German"  }
];
var arr3 = $.extendObjectArray(arr1, arr2, 'name');

console.log(JSON.stringify(arr3, null, 2));
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


ES6 버전

(function($) {
  $.extendObjectArray = (destArr, srcArr, key) => {
    srcArr.forEach(srcObj => (existObj => {
      if (existObj.length) {
        $.extend(true, destArr[destArr.indexOf(existObj[0])], srcObj);
      } else {
        destArr.push(srcObj);
      }
    })(destArr.filter(v => v[key] === srcObj[key])));
    return destArr;
  };
})(jQuery);


0
const extend = function*(ls,xs){
   yield* ls;
   yield* xs;
}

console.log( [...extend([1,2,3],[4,5,6])]  );

2
질문에 대한 답을 제공하지 마십시오. 또한이 솔루션이 문제를 어떻게 해결하는지 설명하십시오.
Mittal Patel

0
merge(a, b, key) {
    let merged = [];
    a.forEach(aitem => {
        let found = b.find( bitem => aitem[key] === bitem[key]);
        merged.push(found? found: aitem);
    });
    return merged;
}

0

2 개의 배열을 병합하고 싶지만 중복 객체를 제거하려면 이것을 사용하십시오. 중복은 .uniqueId각 개체 에서 식별됩니다.

function mergeObjectArraysRemovingDuplicates(firstObjectArray, secondObjectArray) {
  return firstObjectArray.concat(
    secondObjectArray.filter((object) => !firstObjectArray.map((x) => x.uniqueId).includes(object.uniqueId)),
  );
}

0

이 시도:

var a = [{"a":20, "b":10,"c":"c","d":"asd","f":"any"}]
var b = [{"a":20, "b":10,"c":"c", "e":"nan","g":10200}]

var p = []
_.map(a, function(da){
var chk = _.filter(b, function(ds){
return da.a ===ds.a
})[0]
p.push(_.extend(da, chk))


})

console.log(p)

OutPut은 다음과 같습니다.

  [{
    "a": 20,
    "b": 10,
    "c": "c",
    "d": "asd",
    "f": "any",
    "e": "nan",
    "g": 10200
  }]

0
const arr1 = ["Vijendra","Singh"];
const arr2 = ["Singh", "Shakya"];

arr2.forEach(item => {
        if(!arr1.find(k => k===item))
          arr1.push(item)
    });


console.log(arr1)

0

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"));

다음을 생성합니다.

merge () 함수 결과


0
const array1 = [{id:1,name:'ganza'},
{id:2,name:'respice dddd'},{id:4,name:'respice dddd'},{id:6,name:'respice dddd'},
{id:7,name:'respice dddd'}];
const array2 = [{id:1,name:'ganza respice'},{id:2,name:'respice'},{id:3,name:'mg'}];

 function mergeTwoArray(array1,array2){

    return array1.map((item,i)=>{
        if(array2[i] && item.id===array2[i].id){
          return array2[i];
          }else{
            return item;
          }
    });
  }

const result = merge(array1,array2);
console.log(result);
//here is the result:  Array [Object { id: 1, name: "ganza respice" }, Object { id: 2, name: "respice" }, Object { id: 4, name: "respice dddd" }, Object { id: 6, name: "respice dddd" }, Object { id: 7, name: "respice dddd" }]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.