我已经编写了一个脚本来检查对象中是否缺少任何字段,然后返回具有丢失字段的Item的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",
    }
]));





编辑:它必须具有属性,并且不能为Boolean形式的false。

最佳答案

解决方案:

更改:

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。在这种情况下,0falsy

通过使用:

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",
    }
]));

关于javascript - key checkin 对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55482491/

10-11 05:40