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