【问题标题】:Get a property of an object using forEach even though it doesn't exist使用 forEach 获取对象的属性,即使它不存在
【发布时间】:2021-09-21 02:53:07
【问题描述】:

我基本上拥有的是一组具有多个属性的对象,但并非所有对象都具有相同的属性。

const data = [
      {
        car: 12,
        airplane: 42,
        peoples: 2,
      },
      {
        car: 12,
        peoples: 2,
      },
      {
        car: 12,
        airplane: 42,
        peoples: 2,
      },
    ];

我想要做的是应用filter() 来过滤具有以下条件的对象。问题是缺少这些属性的对象,因此代码最终会中断。在不破坏代码的情况下,最好的方法是什么?

data.forEach((item) => item.airplane > 5);

【问题讨论】:

  • 它应该以这种方式工作。你的代码有什么问题?请添加错误,你得到了。

标签: javascript arrays


【解决方案1】:

使用Array#filter

const data = [ { car: 12, airplane: 42, peoples: 2 }, { car: 12, peoples: 2 }, { car: 12, airplane: 42, peoples: 2 } ];

const res = data.filter(({ airplane }) => airplane && airplane > 5);

console.log(res);

【讨论】:

    【解决方案2】:

    您最简洁的选项是使用optional chaining (?.)nullish coalescing operator (??)——这两者的组合允许您在链中的某些属性丢失时使用一些后备选项。因此,您可以将回调重写为:

    (item) => (item?.airplane ?? 0) > 5
    

    在定义item.airplane的情况下,你会得到预期的计算。如果它不是,它将回退到评估0 > 5

    【讨论】:

    • 我在使用 ReactJs 时遇到了这个错误。当前未启用对实验性语法“可选链”的支持
    • 除 IE 外,所有主要浏览器都本机支持该语法——我会检查 this answer for tips on how to enable it in your project——我的 预感 是你使用的是旧版本CRA 版本。对于它的价值,如果这不值得麻烦,在评估比较之前进行简单的存在/真实性检查的任何其他答案都可以正常工作。
    【解决方案3】:

    您需要使用filter(),并且您需要稍微扩展您的过滤器逻辑以检查该属性 -

    const result = data.filter((item) => item.airplane && item.airplane > 5)
    

    【讨论】:

      【解决方案4】:

      在您的函数中,您可以像这样检查项目是否存在:

      const result = data.filter(function(item) {
        if (item.airplane) {
          return item.airplane > 5;
        } else {
          return false;
        }
      });
      

      这甚至可以在严格模式下工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-29
        • 2014-07-16
        • 2018-03-03
        相关资源
        最近更新 更多