我有两个联系人列表:
Old List:
[{ firstname: "James", nickname: "Jim" }];
New List:
[
{ firstname: "Jim" },
{ firstname: "Jane" }
];
我想创建一个测试,将每个新联系人与现有旧联系人进行比较,看看是否匹配。如果名字或昵称匹配,则联系人应该被认为是相同的(因此新的联系人名字和#34;吉姆"应该与旧联系人匹配昵称"吉姆",但不是" ;简"。)
我的第一次尝试非常蹩脚:
let equalFirst = (
( old.firstname === new.firstname ) ||
( old.nickname === new.nickname ) ||
( old.firstname === new.nickname ) ||
( old.nickname === new.firstname )
) ? true : false;
除了不优雅之外,还会返回不正确的相等性。如果两个联系人的昵称都是undefined
,那么JavaScript认为它们是相同的。
如果正在测试的值是真的,我怎样才能检查是否相等?使用Underscore,我得到了一些返回正确相等的东西:
let oldNames = _.compact([ old.firstName, old.nickname ]),
newNames = _.compact([ new.firstName, new.nickname ]),
isMatch = _.some( oldNames, ( item ) => {
return _.contains( newNames, item );
});
但是,我觉得可能有更好的方法来执行此操作,以便排除undefined
值,并且只评估truthy值的相等性。
答案 0 :(得分:0)
加上真实的验证。
let equalFirst = (
( new.firstname && old.firstname === new.firstname ) ||
( new.nickname && old.nickname === new.nickname ) ||
( new.nickname && old.firstname === new.nickname ) ||
( new.firstname && old.nickname === new.firstname )
) ? true : false;
答案 1 :(得分:0)
您可以获取所有名称的集合并检查结果集。
var oldList = [{ firstname: "James", nickname: "Jim" }],
newList = [{ firstname: "Jim" }, { firstname: "Jane" }],
oldSet = new Set(
oldList
.reduce((r, { firstname, nickname }) => r.concat(firstname, nickname), [])
.filter(Boolean) // removes undefined or empty names
),
result = newList.map(
({ firstname, nickname }) => [firstname, nickname].some(v => oldSet.has(v))
);
console.log(result);
console.log([...oldSet]);