Javascript 属性可能不存在时数组中对象属性的不同值

Javascript 属性可能不存在时数组中对象属性的不同值,javascript,json,object,javascript-objects,Javascript,Json,Object,Javascript Objects,我正在基于对象数组中的单个属性创建一个不同值的数组。没有什么不寻常的,但是我正在使用的JSON可能没有这个属性。结果是我在新数组中得到一个值为undefined的项。有没有办法防止这种情况 const cars=[{ “名称”:“丰田”, “模型”:“花冠” }, { “名称”:“丰田”, “范本”:“上文” }, { “名称”:“丰田”, “型号”:“Rav4” }, { “名称”:“丰田” } ]; constdistinctModels=[…新集合(cars.map(car=>car.m

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

const cars=[{
“名称”:“丰田”,
“模型”:“花冠”
},
{
“名称”:“丰田”,
“范本”:“上文”
},
{
“名称”:“丰田”,
“型号”:“Rav4”
},
{
“名称”:“丰田”
}
];
constdistinctModels=[…新集合(cars.map(car=>car.model));

console.log(distinctModels)您可以对数组进行后处理并过滤错误值

const cars=[{name:“丰田”,model:“卡罗拉”},{name:“丰田”,model:“上文”},{name:“丰田”,model:“Rav4”},{name:“丰田”}];
const distinctModels=[…新集合(cars.map(car=>car.model))].filter(布尔);

console.log(distinctModels)使用
.hasOwnProperty
检查对象中是否存在属性

const cars=[{
“名称”:“丰田”,
“模型”:“花冠”
},
{
“名称”:“丰田”,
“范本”:“上文”
},
{
“名称”:“丰田”,
“型号”:“Rav4”
},
{
“名称”:“丰田”
}
];
常量distinctModels=[]
汽车.forEach(功能(e){
e、 hasOwnProperty('model')?distinctModels.push(e.model):false;
});

console.log(distinctModels)
如果要同时过滤和映射(即在一条语句中),可以使用
.reduce()
更好地控制输出数组中的内容:

const cars=[{
“名称”:“丰田”,
“模型”:“花冠”
},
{
“名称”:“丰田”,
“范本”:“上文”
},
{
“名称”:“丰田”,
“型号”:“Rav4”
},
{
“名称”:“丰田”
}
];
const distinctModels=[…新集合(cars.reduce(
(a,car)=>car.model?[…a,car.model]:a,[]
))];

console.log(distinctModels)您可以使用
Array.prototype.flatMap
在一个循环中执行此操作,方法是在值不存在时返回一个空数组。
const cars=[{
“名称”:“丰田”,
“模型”:“花冠”
},
{
“名称”:“丰田”,
“范本”:“上文”
},
{
“名称”:“丰田”,
“型号”:“Rav4”
},
{
“名称”:“丰田”
}
];
const distinctModels=[…新集合(cars.flatMap(car=>car.model | |[]))];

console.log(distinctModels)因此,您可能必须检查未定义!你能解释一下吗:
filter(Boolean)
?它将
Boolean
作为回调,对所有值返回
true
,对所有其他值返回
false
。这允许过滤
未定义的
,以及空字符串。谢谢,我想我应该提到我正在这样做,只是想知道是否有办法避免这样做。@Chris,不,没有。要么提前过滤,要么在最后过滤。最后我更喜欢,因为要过滤的数据量更小。好的,谢谢Nina-你的方法比我当前的实现更简洁,所以我会使用它。再次感谢。