我已经编写了一个脚本来检查对象中是否缺少任何字段,然后返回缺少字段的项ID。
正在返回:
[ '222', '333' ]
我希望返回:
['333']
为什么也返回222
id?
function returnMissingData(items) {
const missing = items.reduce(function(acc, item) {
const fields = [
'Cost',
'Name'
];
for(const key of fields) {
if (!item[key] || item[key] === undefined) {
acc.push(item.Id);
break;
}
}
return acc;
}, []);
return missing;
}
console.log(returnMissingData([
{
Id: "111",
Name: "Name 1",
Cost: 100,
},
{
Id: "222",
Name: "Name 2",
Cost: 0,
},
{
Id: "333",
Name: "Name 3",
}
]));
编辑:它必须具有属性,并且不能为布尔值,否则为false。
答案 0 :(得分:2)
使用过滤器/地图的替代方法。
过滤器使用Array#some()
查找丢失的密钥
function returnMissingData(items) {
const fields = ['Cost','Name'];
return items.filter(o => fields.some(k => !(k in o))).map(({Id}) => Id);
}
console.log(returnMissingData([
{
Id: "111",
Name: "Name 1",
Cost: 100,
},
{
Id: "222",
Name: "Name 2",
Cost: 0,
},
{
Id: "333",
Name: "Name 3",
}
]));
答案 1 :(得分:1)
因为!item[key]
对于虚假值(如0)有效。由于ID为222的对象的键为0,因此它将匹配。
相反,您应该检查对象是否具有随附的密钥
myObj.hasOwnProperty('key')
function returnMissingData(items) {
const missing = items.reduce(function(acc, item) {
const fields = [
'Cost',
'Name'
];
for(const key of fields) {
if (!item.hasOwnProperty(key) || item[key] === undefined) {
acc.push(item.Id);
break;
}
}
return acc;
}, []);
return missing;
}
console.log(returnMissingData([
{
Id: "111",
Name: "Name 1",
Cost: 100,
},
{
Id: "222",
Name: "Name 2",
Cost: 0,
},
{
Id: "333",
Name: "Name 3",
}
]));
答案 2 :(得分:1)
更改:
if (!item[key] || item[key] === undefined)
收件人:
if (item[key] === false || item[key] === undefined)
在遍历键时,检查!item[key]
-等同于检查falsy
值。 Falsy值(如名称Fals- y 所示)不一定表示false
。就像说:
item[key] == false
以上使用类型强制转换来验证item[key]
和false
的值是否相似。它将通过强制更改number
,然后检查其是否为falsy
。在这种情况下,0
是falsy
。
使用:
item[key] === false
我们从代码中删除了类型强制。这更加理智,并且完全按照您的期望进行操作,而不是猜测。
function returnMissingData(items) {
const missing = items.reduce(function(acc, item) {
const fields = [
'Cost',
'Name'
];
for(const key of fields) {
if (item[key] === false || item[key] === undefined) {
acc.push(item.Id);
break;
}
}
return acc;
}, []);
return missing;
}
console.log(returnMissingData([
{
Id: "111",
Name: "Name 1",
Cost: 100,
},
{
Id: "222",
Name: "Name 2",
Cost: 0,
},
{
Id: "333",
Name: "Name 3",
}
]));
答案 3 :(得分:0)
您应该使用hasOwnProperty()
function returnMissingData(items) {
const missing = items.reduce(function(acc, item) {
const fields = [
'Cost',
'Name'
];
for(const key of fields) {
if (!item.hasOwnProperty(key)) {
acc.push(item.Id);
break;
}
}
return acc;
}, []);
return missing;
}
console.log(returnMissingData([
{
Id: "111",
Name: "Name 1",
Cost: 100,
},
{
Id: "222",
Name: "Name 2",
Cost: 0,
},
{
Id: "333",
Name: "Name 3",
}
]));