簡體   English   中英

匹配對象數組中的對象並刪除

[英]match an object in an array of objects and remove

經過兩天的努力,我希望有人可以幫助我。

我有兩個對象數組,如下所示:

let oldRecords = [
  {name: 'john'},
  {name: 'ringo'}
];

let newRecords = [
  {name: 'paul'},
  {name: 'john'},
  {name: 'stuart'}
];

我試圖與返回被添加含有這就是數據的列表命名變量的函數來結束(存在於newRecords但不是在oldRecords )和(在存在已刪除數據的列表oldRecords但不是在newRecords )。

例如

const analyse = (older, newer) => {
  let added, removed;
    // ... magic
  return {added, removed}
}

const {added, removed} = analyse(oldRecords, newRecords);

我不會在該函數中發布我嘗試過的所有代碼,因為我試圖映射,縮小和循環遍歷兩個數組,從而在過去的48小時內創建了臨時數組,現在我可以在書中填入我編寫的代碼,已刪除。 我還使用了underscore.js方法,例如reject / find / findWhere ,這一切都使我很親密,但沒有雪茄。

我遇到的主要問題是因為數組包含對象,如果它們包含數字,則超級簡單,即

var oldRecords = [1, 3];
var newRecords = [1, 2, 4]

function analyse (old, newer) { 
  let added = [];
  let removed = [];

  old.reduce((o) => {
    added = added.concat(_.reject(newer, (num) => num === o ));
  });

  newer.reduce((n) => {
    removed = _.reject(old, (num) => num === n );
  });

  return {added, removed}
}

const {added, removed} = analyse(oldRecords, newRecords);

我該如何實現以上目的,但對象不是數組?

我嘗試修改上面的內容並使用JSON.stringify但實際上並沒有用。

編輯 :重要的一點我忘了添加,它的keys的對象結構是動態的,它們來自數據庫,因此對key任何單獨檢查也必須是動態的,即不是硬編碼值

您可以使用拒絕一些來檢查是否包含在適當的集合中。 isEqual函數用於檢查是否相等以處理動態鍵:

const analyse = (older, newer) => {
  let added = _.reject(newer, n => _.some(older, o =>_.isEqual(n, o)));
  let removed = _.reject(older, o => _.some(newer, n => _.isEqual(n, o)));

  return {added, removed}
}

您可以嘗試以下方法:

const analyse = (older, newer) => {
   let removed = older.filter(newItem => {
     return newer.filter(oldItem => {
        return _.isEqual(newItem, oldItem);
     }).length === 0
   });

   let added = newer.filter(oldItem => {
     return older.filter(newItem => {
        return _.isEqual(newItem, oldItem);
     }).length === 0
   });

   return {added, removed};
}

您可以首先創建函數來檢查兩個對象是否相等,然后結束,然后使用filter()some()返回結果。

 let oldRecords = [ {name: 'john'}, {name: 'ringo'} ]; let newRecords = [ {name: 'paul'}, {name: 'john'}, {name: 'stuart'} ]; function isEqual(o1, o2) { return Object.keys(o1).length == Object.keys(o2).length && Object.keys(o1).every(function(key) { return o2.hasOwnProperty(key) && o1[key] == o2[key] }) } var result = {} result.removed = oldRecords.filter(e => !newRecords.some(a => isEqual(e, a))) result.added = newRecords.filter(e => !oldRecords.some(a => isEqual(e, a))) console.log(result) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM