#javascript #arrays #json
#javascript #массивы #json
Вопрос:
У меня есть 2 вложенных массива, которые мне нравится сравнивать друг с другом и возвращать все значения в массиве 1 и массиве 2 одинаковые. Я пытался использовать array1.include(array2)
, но это не сработало.
let arry1 = [['B0844PGXJR', '7'],
['B085H4C8Z6', '1'],
['B087RS4RWL', '7'],
['B088LKDK3V', '4']] ;
let arry2= [['B0844PGXJR', '6'],
['B085H4C8Z6', '1'],
['B087RS4RWL', '7'],
['B088LKDR3V', '2']] ;
Вывод :
Result = [ ['B085H4C8Z6', '1'],
['B087RS4RWL', '7'] ];
Ответ №1:
Array#includes
принимает примитивное значение или ссылку на объект, например, массивы, и проверяет то же значение или ссылку. Имея разные массивы с одинаковым содержимым, вы получаете разные ссылки на объекты.
Вы могли бы взять a Set
со строковыми массивами и отфильтровать второй массив с помощью других строковых массивов.
const
array1 = [['B0844PGXJR', '7'], ['B085H4C8Z6', '1'], ['B087RS4RWL', '7'], ['B088LKDK3V', '4']],
array2 = [['B0844PGXJR', '6'], ['B085H4C8Z6', '1'], ['B087RS4RWL', '7'], ['B088LKDR3V', '2']],
set1 = new Set(array1.map(a => JSON.stringify(a))),
common = array2.filter(a => set1.has(JSON.stringify(a)));
console.log(common);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ №2:
вы можете попробовать использовать reduce, чтобы отслеживать список значений из другого списка.
let arry1 = [['B0844PGXJR', '7'],
['B085H4C8Z6', '1'],
['B087RS4RWL', '7'],
['B088LKDK3V', '4']] ;
let arry2= [['B0844PGXJR', '6'],
['B085H4C8Z6', '1'],
['B087RS4RWL', '7'],
['B088LKDR3V', '2']] ;
const duplicateValues = arry2.reduce((accumulated, current) => {
const mappedKeys = arry1.reduce((acc, curr) => {
const key = curr.join(' ');
return {
...acc,
[key]: true
}
}, {});
const currKey = current.join(' ');
if (mappedKeys[currKeys]) {
accumulated.duplicated.push(current);
}
return accumulated;
}, {
duplicated: []
});
const duplicate = duplicateValues.duplicated;
Ответ №3:
Если положение этих элементов останется неизменным, вы могли бы сделать что-то вроде этого (если вы не можете использовать наборы из ответа @Nina):
Codepen: https://codepen.io/koiralakiran1/pen/RwoGNeN?editors=0011
let arry1 = [['B0844PGXJR', '7'],
['B085H4C8Z6', '1'],
['B087RS4RWL', '7'],
['B088LKDK3V', '4']] ;
let arry2= [['B0844PGXJR', '6'],
['B085H4C8Z6', '1'],
['B087RS4RWL', '7'],
['B088LKDR3V', '2']] ;
let arr1str = arry1.map(i => JSON.stringify(i));
let arr2str = arry2.map(i => JSON.stringify(i));
let filtered = arr1str.filter(i => arr2str.includes(i))
.map(i => JSON.parse(i));
console.log(filtered);