在解决这个问题2天后,我希望有人可以帮助我。
我有两个对象数组,如下所示:
newRecords
我正在尝试使用一个返回命名变量的函数,该变量包含已添加的数据列表(存在于oldRecords
但不存在于oldRecords
中)以及已删除的数据列表(存在newRecords
但不存在于const analyse = (older, newer) => {
let added, removed;
// ... magic
return {added, removed}
}
const {added, removed} = analyse(oldRecords, newRecords);
中)。
例如
reject
我不会发布我在这个函数中尝试的所有代码,因为我试图映射,减少并遍历两个数组,在过去48小时内创建临时数组,现在我可以填写一本书了我已经编写并删除了代码。我还使用了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);
这样的underscore.js方法,这些方法让我很接近,但没有雪茄。
我遇到的主要问题是因为数组包含对象,如果它们包含数字则非常容易,即
JSON.stringify
如何实现上述目标,但对象不是数组?
n.b。我尝试修改上述内容并使用keys
,但它并没有真正起作用。
编辑:重要的一点,我忘了添加,它的key
对象结构是动态的,它们来自数据库,因此任何单独检查{{{ 1}}也必须是动态的,即不是硬编码值
答案 0 :(得分:2)
您可以使用reject和some来检查是否包含在相应的集合中。 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}
}
答案 1 :(得分:0)
你可以试试这个:
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};
}
答案 2 :(得分:0)
您可以先创建函数来检查两个对象是否相等,然后结束然后使用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)