Удалить элемент массива, если одно из свойств содержит определенные значения - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть следующая переменная:

var data = [{id: '1', name: 'demo1'}, {id: '2', name: 'demo2'}, {id: '3', name: 'demo3'}]

Теперь у меня есть другой список id s,

var lookFor = ["2", "3"];

Теперь, из data, как я буду удалять объекты сid недоступно в массиве lookFor id с.

Я пытался выполнить следующие действия:

_.filter(data, function(item) {
  return _.contains(lookFor, 'id');
});

Есть ли другой способ?

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

Вот лишь несколько примеров того, как вы можете достичь этого только с ES6 или lodash.Очевидно, есть и другие способы сделать это, но они должны дать вам представление.Также обратите внимание, что большинство примеров do not изменяют используемые массивы:

var data = [{id: '1', name: 'demo1'}, {id: '2', name: 'demo2'}, {id: '3', name: 'demo3'}]
var lookFor = ["2", "3"];

// Does not mutate the array and uses ES6 Filter
var withFilter = data.filter(x => lookFor.indexOf(x.id) >= 0)

// Does not mutate the array and uses ES6 Reduce
var withReduce = lookFor.reduce((r,c) => r.push(data.find(x => x.id === c) || []) && r,[])

// Does not mutate the array with Lodah Filter
var withLodashFilter = _.filter(data, x => _.includes(lookFor, x.id))

// Mutates the array with Lodash Remove
var withLodashRemove = _.remove(data, x => _.includes(lookFor, x.id))

console.log('ES6 Filter', withReduce)
console.log('ES6 Reduce', withFilter)
console.log('Lodah Filter', withLodashFilter)
console.log('Lodash Remove', withLodashRemove)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
0 голосов
/ 20 сентября 2018

Хм, подумайте о следующем?

var data = [{id: '1', name: 'demo1'}, {id: '2', name: 'demo2'}, {id: '3', name: 'demo3'}];
var keys = ["2", "3"];

let filteredArray = data.filter(element => keys.indexOf(element.id) != -1);
console.log(filteredArray);

// Output is now 
// 0: {id: "2", name: "demo2"}
// 1: {id: "3", name: "demo3"}

Используйте это, чтобы получить обратное:

let filteredArray = data.filter(element => keys.indexOf(element.id) == -1);
console.log(filteredArray);

// Output is:
// 0: {id: "1", name: "demo1"}

Это то, что вы хотите?

Хорошего дня,Элиас

0 голосов
/ 20 сентября 2018

Вы можете использовать _.remove(array, [predicate=_.identity]) следующим образом.Обратите внимание, что это изменяет значение data.

var data = [{id: '1', name: 'demo1'}, {id: '2', name: 'demo2'}, {id: '3', name: 'demo3'}];

var lookFor = ["2", "3"];

_.remove(data, function(n) {
  return _.indexOf(lookFor, n.id) === -1;
});

console.log(data);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>
0 голосов
/ 20 сентября 2018

Вы можете использовать фильтр функтора для массива и метод включает от до

, чтобы определить, содержит ли массив определенный элемент

 var res =  data.filter(el=>!lookFor.includes(el.id));

результат

 [{id: "1", name: "demo1"}]

напротив

var res =  data.filter(el=>lookFor.includes(el.id));
...