Сравнение двумерного массива JS
Даны два массива:
array_1 = [
{data: "2020-05-30",users:[user1]},
{data: "2020-05-29",users:[user1]}
]
array_2 = [
{data: "2020-05-25",users:[user1,user2,user3]},
{data: "2020-05-28",users:[user4,user5,user3]},
{data: "2020-05-29",users:[user2,user3,user1,]}
{data: "2020-05-30",users:[user1]}
]
И мне нужно сравнить вхождение одного в другой, с глубиной, чтобы данное выражение выдало например true (что первый массив входит во второй), хотелось бы увидеть предложения профессионалов, как можно это обыграть с малым количеством циклов, да, конечно можно это сделать через lodash с одним циклом и find, но думаю что можно обыграть как-то интереснее.
Использовал lodash и difference, сравнивает только он не учитывает индексы.
Спасибо, я только начинаю)
Ответы (1 шт):
Автор решения: shutdown
→ Ссылка
Если я правильно понял:
function CreateUser(name) {
this.name = name;
}
let user1 = new CreateUser("Иван");
let user2 = new CreateUser("Александр");
let user3 = new CreateUser("Михаил");
let user4 = new CreateUser("Анатолий");
let user5 = new CreateUser("Никита");
let array_1 = [
{data: "2020-05-30",users:[user1]},
{data: "2020-05-29",users:[user1]}
];
let array_2 = [
{data: "2020-05-29",users:[user2,user3, user1]},
{data: "2020-05-28",users:[user4,user5,user3]},
{data: "2020-05-30",users:[user1]},
{data: "2020-05-25",users:[user1,user2,user3]},
];
function compare(sub, main) {
for(let i = 0; i < sub.length; i++) {
let obj = main.find( item => item.data === sub[i].data); // (*)
if(obj) {
for(let j = 0; j < sub[i].users.length; j++) {
if(!obj.users.includes(sub[i].users[j])) return false;
}
}
else {
return false;
}
}
return true;
}
console.log(compare(array_1, array_2)); // true
array_2[2].users.pop();
console.log(compare(array_1, array_2)); // false
Чтобы учитывать индексы, можно в строке (*) проверять их равенство:
let obj = main.find( (item, index) => item.data === sub[i].data && index == i);