Объединить 2 массива объектов - PullRequest
76 голосов
/ 22 августа 2011

Давайте рассмотрим пример.

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

Мне нужно объединить эти 2 массива объектов и создать следующий массив.

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

Есть ли какая-либо функция jScript или jQuery для этого?

$. Расширение меня не устраивает. Возвращает

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

Спасибо заранее, Александр.

Ответы [ 26 ]

0 голосов
/ 06 июля 2018
const extend = function*(ls,xs){
   yield* ls;
   yield* xs;
}

console.log( [...extend([1,2,3],[4,5,6])]  );
0 голосов
/ 14 марта 2016

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

0 голосов
/ 17 апреля 2017

Используя lodash вы хотите _.uniqBy

var arr3 = _.uniqBy(arr1.concat(arr2), 'name'); // es5

let arr3 = _.uniqBy([...arr1, ...arr2], 'name'); // es6

Порядок arr1, arr2 имеет значение!

См. Документы https://lodash.com/docs/4.17.4#uniqBy

0 голосов
/ 28 февраля 2017

Вот плагин 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 голосов
/ 15 января 2019

Если вы хотите объединить 2 массива, но удалить повторяющиеся объекты, используйте это.Дубликаты идентифицируются на .uniqueId каждого объекта

function mergeObjectArraysRemovingDuplicates(firstObjectArray, secondObjectArray) {
  return firstObjectArray.concat(
    secondObjectArray.filter((object) => !firstObjectArray.map((x) => x.uniqueId).includes(object.uniqueId)),
  );
}
0 голосов
/ 22 августа 2011

От макушки головы - попробуйте jquery extension

var arr3 = jQuery.extend(arr1,arr2....)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...