Подтвердить что ты не робот

Массив фильтра не в другом массиве

Необходимо фильтровать один массив на основе другого массива. Есть ли функция утилизации в нокауте? иначе мне нужно перейти с 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
}];
4b9b3361

Ответ 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;
};