Я имею следующий массив объектов:
rows = [
{
name: "user1",
previlege: "Filtering"
},
{
name: "user2",
previlege: "Reportering"
},
{
name: "user3",
previlege: "Filtering"
}
]
И другой массив объектов:
selected = [
{
name: "user1",
previlege: "Filtering"
},
{
name: "user2",
previlege: "Reportering"
},
]
Мне нужно отфильтровать первый массив удалив все совпадения с вторим. То есть я должен получить
rows = [
{
name: "user3",
previlege: "Filtering"
}
]
Я пробую сделать это так:
this.array = this.rows.filter((current)=>
JSON.stringify(current) !== JSON.stringify(this.selected[0])
);
Но логически удаляется только первая запись. Я понимаю, что мне нужно что-то вроде вложенной функции filter или просто вложений цикл for чтоб пройтись по массиве selected, но все мои попытки не увенчались успехом. Помогите мне отфильтровать этот массив
Просто отфильтровать первый массив, проверяя, нет ли похожих данных во втором. Я использовал поиск по именю юзера с помощью .some():
var rows = [
{
name: "user1",
previlege: "Filtering"
},
{
name: "user2",
previlege: "Reportering"
},
{
name: "user3",
previlege: "Filtering"
}
];
var selected = [
{
name: "user1",
previlege: "Filtering"
},
{
name: "user2",
previlege: "Reportering"
},
]
var array = rows.filter(r => !selected.some(s => s.name == r.name));
console.log(array);
Говоря о вашей реализации - вы фильтровали массив на совпадения с нулевым элементом (JSON.stringify(this.selected[0]))
Можно просто перебрать каждое значение с каждым, цикл в цикле, но это будет не самое быстрое решение, и пойдет только если ваши массивы не очень большие и производительность не очень важна:
for (var i = 0; i < rows.length; i++) {
for (var n = 0; n < selected.length; n++) {
//compare arrays here
If(rows[i] ==selected[n]){
return 'arrays are equal'
}
}
}
Действительно, надо в массиве selected поискать entry,
вашу идею можно переписать вот так:
const rows = [
{
name: "user1",
previlege: "Filtering"
},
{
name: "user2",
previlege: "Reportering"
},
{
name: "user3",
previlege: "Filtering"
}
]
const selected = [
{
name: "user1",
previlege: "Filtering"
},
{
name: "user2",
previlege: "Reportering"
},
]
console.log(rows.filter(current=>
{
const currentString = JSON.stringify(current); //небольшая оптимизация
return !selected.some(entry=> JSON.stringify(entry) === currentString);
}
));
но эта реализация завязана на порядок ключей,в хроме это не сработает если перевернуть инициализацию свойств. Для честного сравнения, нужно быть намного более аккуратным:
const rows = [{
name: "user1",
previlege: "Filtering"
},
{
previlege: "Reportering",
name: "user2",
struct: {
a: 1,
b: "a"
}
},
{
name: "user3",
previlege: "Filtering"
}
]
const selected = [{
name: "user1",
previlege: "Filtering"
},
{
name: "user2",
previlege: "Reportering",
struct: {
a: 1,
b: "a"
}
},
];
console.log(rows.filter(current => !selected.some(entry => deepEq(entry, current))));
function deepEq(a, b) {
const keysA = Object.keys(a);
const keysB = Object.keys(b);
if (keysA.length !== keysB.length) {
return false;
}
return !keysA.some(keyA =>
typeof a[keyA] !== "object" && a[keysA] !== null
? a[keyA] !== b[keyA]
: !deepEq(a[keyA], b[keyA])); //рекурсия для объектов
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости