Как сравнить вложенный массив и вернуть значение true

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