Отфильтровать объекты из другого массива в цикле

1

У меня есть массив объектов 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, без конкретной библиотеки.

Спасибо, вперед!

  • 0
    какой выход ты хочешь
  • 0
    Отредактировал вопрос
Показать ещё 3 комментария
Теги:
arrays

4 ответа

1
Лучший ответ
filteredItems =  this.allItems.filter(x => {
    return !this.fewItems.some(y => JSON.stringify(y) == JSON.stringify(x))
});
  • 0
    Самое элегантное решение, спасибо :)
  • 3
    просто будьте осторожны с stringify stackoverflow.com/questions/15376185/… .
1

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)
1

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);
  • 0
    Эй, спасибо за это ... Но мне не нравится идея интегрировать lodash в приложение Angular. Я действительно хотел бы сделать это без, если это вообще возможно.
  • 1
    @JeremyBelolo проверить решение без lodash, отредактированный ответ
Показать ещё 1 комментарий
1

Чистое решение 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню