Массив фильтра не в другом массиве
Необходимо фильтровать один массив на основе другого массива. Есть ли функция утилизации в нокауте? иначе мне нужно перейти с javascript
Сначала:
var obj1 = [{
"visible": "true",
"id": 1
}, {
"visible": "true",
"id": 2
}, {
"visible": "true",
"id": 3
}, {
"Name": "Test3",
"id": 4
}];
Второе:
var obj2 = [ 2,3]
Теперь мне нужно отфильтровать obj1 на основе obj2 и вернуть элементы из obj1, которые не находятся в obj2 omittng 2,3 в приведенных выше данных (Сравнение по объекту 1 Id)
выход:
[{
"visible": "true",
"id": 1
}, {
"Name": "Test3",
"id": 4
}];
Ответы
Ответ 1
Вы можете просто запустить obj1
с помощью filter
и использовать indexOf
на obj2
, чтобы увидеть, существует ли он. indexOf
возвращает -1
, если значение отсутствует в массиве, и filter
включает элемент, когда обратный вызов возвращает true
.
var arr = obj1.filter(function(item){
return obj2.indexOf(item.id) === -1;
});
С более новым синтаксисом ES и API, это становится проще:
const arr = obj1.filter(i => obj2.includes(i.id))
Ответ 2
Чтобы создать свой выходной массив, создайте функцию, которая будет перебирать через obj1 и заполнять новый массив на основе того, существует ли id всех объектов obj в итерации в obj2.
var obj1 = [{
"visible": "true",
"id": 1
}, {
"visible": "true",
"id": 2
}, {
"visible": "true",
"id": 3
}, {
"Name": "Test3",
"id": 4
}];
var obj2 = [2,3]
var select = function(arr) {
var newArr = [];
obj1.forEach(function(obj) {
if obj2.indexOf(obj.id) !== -1 {
newArr.push(obj)
};
};
return newArr;
};