Давайте посмотрим на пример.
var arr1 = new Array({name: "lang", value: "English"}, {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'});
Есть ли для этого какая-нибудь функция JavaScript или jQuery?
$.extend
мне не подходит. Он возвращается
arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
javascript
jquery
arrays
Александр
источник
источник
{name: "lang", value: "English"}
?Ответы:
Если вы хотите объединить 2 массива объектов в JavaScript. Вы можете использовать этот трюк с одной строкой
Array.prototype.push.apply(arr1,arr2);
Например
Вывод:
источник
arr1 = arr1.concat(arr2)
concat
вернет новый массив и сломает все ссылки, которые у вас были.С ES6 вы можете сделать это очень просто, как показано ниже:
Вывод:
источник
{ name: 'lang', value: 'German'}
Для тех, кто экспериментирует с современными вещами:
источник
Обновление 12 октября 2019 г.
Новая версия, основанная только на более новом Javascript и без использования сторонней библиотеки.
Этот ответ устарел, такие библиотеки, как lodash и подчеркивание, в наши дни нужны гораздо меньше. В этой новой версии целевой массив (arr1) - это тот массив, с которым мы работаем и хотим постоянно обновлять. Источник (arr2) массив , где новые данные приходят, и мы хотим , чтобы она сливалась в нашей целевой массив.
Мы перебираем исходный массив в поисках новых данных, и для каждого объекта, который еще не найден в нашем целевом массиве, мы просто добавляем этот объект, используя target.push (sourceElement) Если на основе нашего ключевого свойства ('name') , объект уже находится в нашем целевом массиве - мы обновляем его свойства и значения с помощью Object.assign (targetElement, sourceElement) . Нашей «целью» всегда будет один и тот же массив с обновленным содержимым.
Старый ответ с использованием подчеркивания или lodash
Я всегда приезжаю сюда из Google и всегда не удовлетворяюсь ответами. ВЫ ответите хорошо, но с помощью underscore.js будет проще и аккуратнее
ДЕМО: http://jsfiddle.net/guya/eAWKR/
Вот более общая функция, которая объединит 2 массива, используя свойство их объектов. В этом случае свойство - «имя».
источник
источник
Очень просто использовать оператор распространения ES6:
Merged Array: [ {a: 'HI!'}, {b: 'HOW'} {c: 'ARE'}, {d: 'YOU?'} ]
Примечание. Приведенное выше решение - просто объединить два массива с помощью оператора распространения ES6.
Изменить 07 января 2020 года, автор: @ bh4r4th: Поскольку контекст изменился из-за правок после моего первоначального решения. Я хочу обновить свое решение, чтобы оно соответствовало текущим критериям. т.е.
Объединить объекты массива без создания повторяющихся объектов и,
обновить,
value
еслиname
свойство уже существует в предыдущем массивеисточник
set
при слиянии для удаления дубликатов. Это создаст новый аргумент переменной, но с минимальным кодом. Однако я не большой поклонник полезной нагрузки, имена которой определены как свойства, а значения - как разные типы. Вместо этого я предпочитаю[ { lang: 'German', age: 25}]
. Таким образом, вес полезной нагрузки будет минимизирован при обмене данными между сервисами.Объединение двух массивов:
Объединение двух массивов без повторяющихся значений для 'name':
источник
Самый простой способ - использовать магию ES6:
Объедините два с дубликатами:
Без дубликатов это то же самое, что и выше, плюс:
const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]
источник
С lodash:
источник
Вот как я решил аналогичную проблему в контексте ES6:
Примечание. При таком подходе не будут возвращены элементы из array1, которых нет в array2.
РЕДАКТИРОВАТЬ: У меня есть несколько сценариев, в которых я хочу сохранить элементы, которых нет во втором массиве, поэтому я придумал другой метод.
источник
Еще одна версия с использованием
reduce() method
:источник
источник
Вы можете использовать объект для сбора ваших свойств при замене дубликатов, а затем развернуть / сгладить этот объект обратно в массив. Что-то вроде этого:
Я не знаю, является ли это самым быстрым способом, но он работает для любого количества входных массивов; например, это:
Дает то же самое,
a
что былоarr3
с заменой «немецкого» на «блины».Этот подход предполагает,
{name: ..., value: ...}
конечно, что все ваши объекты имеют одинаковую форму.Вы можете увидеть, как он работает здесь (откройте консоль): http://jsfiddle.net/ambiguous/UtBbB/
источник
А как насчет jQuery Merge?
http://api.jquery.com/jQuery.merge/
Пример jsFiddle здесь: http://jsfiddle.net/ygByD/
источник
name
свойствам.Я столкнулся с той же проблемой, и, основываясь на ответе гуя, я расширил библиотеку подчеркивания, а также добавил немного больше функций, которые мне требовались. Вот суть .
Надеюсь, это будет полезно! С уважением!
источник
Я недавно столкнулся с этой проблемой, и я пришел сюда в надежде получить ответ, но в принятом ответе используется 2 для циклов in, которые я бы предпочел. Наконец-то мне удалось сделать свое собственное. Не зависит ни от какой библиотеки:
Это также поддерживает порядок arr1.
источник
вы можете использовать следующую функцию
и попробуйте
источник
Здесь я сначала фильтрую
arr1
на основе присутствующего элементаarr2
или нет. Если он присутствует, не добавляйте его в результирующий массив, иначе добавьте. А потом добавляюarr2
к результату.источник
Сверху в голове - попробуйте jquery extend
источник
var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);
источник
Array.protype.push.apply()
ответ, но он не выполняет слияние, как того хотел OP.На основе ответа @YOU, но с соблюдением порядка:
Я знаю, что это решение менее эффективно, но оно необходимо, если вы хотите сохранить порядок и при этом обновлять объекты.
источник
Вот плагин jQuery, который я написал для объединения двух массивов объектов по ключу. Имейте в виду, что это изменяет целевой массив на месте.
Версия ES6
источник
Используя lodash, вы хотите _.uniqBy
Порядок arr1, arr2 имеет значение!
См. Документы https://lodash.com/docs/4.17.4#uniqBy
источник
источник
источник
Если вы хотите объединить 2 массива, но удалить повторяющиеся объекты, используйте это. Дубликаты идентифицируются на
.uniqueId
каждом объектеисточник
Попробуй это:
OutPut будет:
источник
источник
Решение с использованием JS Map:
Что производит:
источник
источник