【问题标题】:Check for equality only among truthy values in JavaScript?仅在 JavaScript 中的真值之间检查是否相等?
【发布时间】: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


    【解决方案1】:

    添加真实验证。

    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;
    

    【讨论】:

      【解决方案2】:

      您可以取一组所有名称并检查结果集。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 2016-10-16
        • 2018-09-05
        • 1970-01-01
        相关资源
        最近更新 更多