Я имею следующий массив объектов:
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])); //рекурсия для объектов
}
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Когда край окна достигнет блока с классомour-mission, то к блоку с классом
Вопрос глуповат, но я постоянно забываю, как происходит наследование и выборка(извиняюсь за французский) дочерних элементов в классах?