【问题标题】:Distinct values from object property in array when property may not be present当属性可能不存在时,数组中的对象属性的不同值
【发布时间】:2019-12-07 11:47:08
【问题描述】:

我正在基于对象数组中的单个属性创建一个不同值的数组。没有什么不寻常的,但我正在使用的 JSON可能没有该属性。结果是我在新数组中获得了一个值为undefined 的项目。有没有办法防止这种情况发生?

const cars = [{
    "name": "Toyota",
    "model": "Corolla"
  },
  {
    "name": "Toyota",
    "model": "Supra"
  },
  {
    "name": "Toyota",
    "model": "Rav4"
  },
  {
    "name": "Toyota"
  }
];

const distinctModels = [...new Set(cars.map(car => car.model))];

console.log(distinctModels);

编辑 - 我应该提到我很想知道是否有办法在仍然使用 new Set 的同时做到这一点。

【问题讨论】:

  • 所以可能你必须检查未定义!

标签: javascript json object javascript-objects


【解决方案1】:

您可以对数组进行后处理并过滤虚假值。

const cars = [{ name: "Toyota", model: "Corolla" }, { name: "Toyota", model: "Supra" }, { name: "Toyota", model: "Rav4" }, { name: "Toyota" }];

const distinctModels = [...new Set(cars.map(car => car.model))].filter(Boolean);

console.log(distinctModels);

【讨论】:

  • 你能解释一下吗:filter(Boolean)
  • 它将Boolean 作为回调函数,它为所有truthy 值返回true,为所有其他值返回false。这允许过滤undefined,以及空字符串。
  • 谢谢,我想我应该提到我正在这样做,只是想知道是否有办法避免这样做。
  • @Chris,不,没有。提前或最后过滤。我更喜欢最后,因为要过滤的数据量较小。
  • 好的,谢谢 Nina - 你的方法比我目前的实现更简洁,所以会使用它。再次感谢。
【解决方案2】:

使用.hasOwnProperty检查对象中是否存在属性

const cars = [{
    "name": "Toyota",
    "model": "Corolla"
  },
  {
    "name": "Toyota",
    "model": "Supra"
  },
  {
    "name": "Toyota",
    "model": "Rav4"
  },
  {
    "name": "Toyota"
  }
];

const distinctModels = []
cars.forEach(function(e){
e.hasOwnProperty('model')?distinctModels.push(e.model):false;
});
console.log(distinctModels);

【讨论】:

    【解决方案3】:

    如果您想同时过滤和映射(即在一个语句中),您可以改用.reduce() 来更好地控制输出数组的内容:

    const cars = [{
        "name": "Toyota",
        "model": "Corolla"
      },
      {
        "name": "Toyota",
        "model": "Supra"
      },
      {
        "name": "Toyota",
        "model": "Rav4"
      },
      {
        "name": "Toyota"
      }
    ];
    
    const distinctModels = [...new Set(cars.reduce(
                             (a, car) => car.model ? [...a, car.model] : a, []
                            ))];
    
    console.log(distinctModels);

    【讨论】:

      【解决方案4】:

      您可以使用Array.prototype.flatMap 在一个循环中执行此操作,方法是在值不存在时返回一个空数组。

      const cars = [{
      	"name": "Toyota",
      	"model": "Corolla"
      },
      {
      	"name": "Toyota",
      	"model": "Supra"
      },
      {
      	"name": "Toyota",
      	"model": "Rav4"
      },
      {
      	"name": "Toyota"
      }
      ];
      
      const distinctModels = [...new Set(cars.flatMap(car => car.model || []))];
      
      console.log(distinctModels);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        相关资源
        最近更新 更多