只检查JavaScript中的truthy值是否相等?

时间:2018-03-25 13:28:52

标签: javascript logic underscore.js logical-operators

我有两个联系人列表:

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值的相等性。

2 个答案:

答案 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]);