密钥签入对象

时间:2019-04-02 19:48:03

标签: javascript node.js

我已经编写了一个脚本来检查对象中是否缺少任何字段,然后返回缺少字段的项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。

4 个答案:

答案 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。在这种情况下,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",
    }
]));

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