[英]JavaScript map and match array of objects with object of objects
[英]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
任何單獨檢查也必須是動態的,即不是硬編碼值
您可以嘗試以下方法:
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.