У меня есть массив объектов allItems
allItems = [
{ id: 1, name: 'item1' },
{ id: 2, name: 'item2' },
{ id: 3, name: 'item3' }
]
Я хочу, чтобы он отфильтровывал и не содержал объекты, содержащиеся в другом массиве, из моего компонента.
fewItems = [
{ id: 2, name: 'item2' }
]
поэтому, filteredItems
должны быть:
filteredItems = [
{ id: 1, name: 'item1' },
{ id: 3, name: 'item3' }
]
И когда другой объект из allItems
добавляется к нескольким fewItems
, он должен исчезать из filteredItems
fewItems
.
Я хотел бы сделать это в чистом ваниле JS, без конкретной библиотеки.
Спасибо, вперед!
filteredItems = this.allItems.filter(x => {
return !this.fewItems.some(y => JSON.stringify(y) == JSON.stringify(x))
});
var allItems = [
{ id: 1, name: 'item1' },
{ id: 2, name: 'item2' },
{ id: 3, name: 'item3' }
];
var fewItems = [
{ id: 2, name: 'item2' }
];
var keys = Object.keys( fewItems[0] )
var result = allItems.filter(
function(item){
for( var k = fewItems.length-1; k>=0; --k){
var dontWant = fewItems[k];
var i=keys.length-1;
for( ; i>=0; --i ){
if( dontWant[keys[i]] != item[keys[i]]){ break; }
}
if( i == -1){ return false;}
}
return true;
}
);
console.log(result)
var allItems = [
{ id: 1, name: 'item1' },
{ id: 2, name: 'item2' },
{ id: 3, name: 'item3' }
];
var fewItems = [
{ id: 2, name: 'item2' }
];
var result3 = _(allItems)
.differenceBy(fewItems, 'id', 'name')
.map(_.partial(_.pick, _, 'id', 'name'))
.value();
console.log(result3);
<script src='https://cdn.jsdelivr.net/lodash/4.17.2/lodash.min.js'></script>
РЕДАКТИРОВАТЬ
Без Lodash
var allItems = [
{ id: 1, name: 'item1' },
{ id: 2, name: 'item2' },
{ id: 3, name: 'item3' }
];
var fewItems = [
{ id: 2, name: 'item2' }
];
var props = ['id', 'name'];
var result = allItems.filter(function(o1){
return !fewItems.some(function(o2){
return o1.id === o2.id;
});
}).map(function(o){
return props.reduce(function(newo, name){
newo[name] = o[name];
return newo;
}, {});
});
console.log(result);
Чистое решение JS
var allItems = [
{ id: 1, name: 'item1' },
{ id: 2, name: 'item2' },
{ id: 3, name: 'item3' }
];
var fewItems = [
{ id: 2, name: 'item2' }
];
var result3 = allItems
.filter(item => {
for(let restrictedItem of fewItems) {
if (JSON.stringify(restrictedItem) === JSON.stringify(item)) {
return false;
}
}
return true;
})
console.log(result3);