迭代一个Object以验证它是否存在于数组中

时间:2016-05-05 17:20:43

标签: javascript arrays underscore.js javascript-objects

继承情况 -

我有一个数组和一个对象。

说:

var Array = ["field1", "field2", "field3"];
var Object = { field1: undefined, field2: undefined, field3: undefined, field4: undefined, field5: undefined}

*对象中的值现在并不重要

使用underscoreJS我想迭代Object并检查Array数组中是否存在每个键。如果是的话,我希望能够将其值设置为true,如果不是,我想将其设置为false。

到目前为止,我已经尝试过:

 _.mapObject(Object, function(val, key){

        for (var j = 0; j < Array.length; j++) {
            currentKey = Array[j];
            (function(i){
                for (var k = 0; k < Array.length; k++) {
                    if(key === Array[i]) {
                        return val = true;
                    } else {
                        return val = false;
                    }
                }
            })(currentKey);
        }

    });

狗屎很混乱;对我来说至少。任何帮助都是值得赞赏的。

4 个答案:

答案 0 :(得分:1)

我认为你不需要强调这一点:

var a = ["field1", "field2", "field3"];
var o = { field1: undefined, field2: undefined, field3: undefined, field4: undefined, field5: undefined}

for (var k in o) {
  o[k] = a.indexOf(k) != -1;
}

答案 1 :(得分:1)

正如其他人所说,不需要下划线。

您可以使用本机Object.keys返回own个键的数组,然后迭代它们。 Object.keys将不会包含原型链中for in将继承的属性。然而,它相当慢,这可能是大型数据集的问题。

Object.keys(obj)
    .forEach(function (key) {
        obj[key] = (arr.indexOf(key) !== -1);
    });

Fiddle

Object.keys

答案 2 :(得分:1)

以下是使用下划线的解决方案:

    var result = _.mapObject(Object, function(value, field){
        return _.contains(Array, field);
    });

或者如果你想改变对象本身:

    var result = _.each(Object, function(value, field){
        return _.contains(Array, field);
    });

答案 3 :(得分:0)

您不需要underscore来执行此操作:

var arr = ['a','b','c'],
        obj = {a: '', b: '', c: '', d:''};

function check (a, o) {
    for (var key in o) {
        if (a.indexOf(key) != -1) {
            o[key] = true
        }
    }
}

check(arr,obj);

document.write(JSON.stringify(obj))