【发布时间】:2018-03-25 13:28:52
【问题描述】:
我有两个联系人列表:
Old List:
[{ firstname: "James", nickname: "Jim" }];
New List:
[
{ firstname: "Jim" },
{ firstname: "Jane" }
];
我想创建一个测试,将每个新联系人与现有的旧联系人进行比较,看看是否匹配。如果名字或昵称匹配,则联系人应被视为相等(因此,名字为“Jim”的新联系人应与昵称为“Jim”的旧联系人匹配,而不是“Jane”)。
我的第一次尝试很蹩脚:
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 值,并且只评估真实值是否相等。
【问题讨论】:
标签: javascript logic underscore.js logical-operators