检查对象是否具有与数组中定义的相同的字段值

时间:2014-02-05 14:52:03

标签: javascript arrays backbone.js underscore.js

我有一个这样的数组:

var Items = new Array({ name: "aaa", field: "bbb", val: true },
                      { name: "ccc", field: "ddd", val: false })

我想检查某个对象是否具有field&中定义的相同字段值。数组的val

我这样做了:

var obj = {bbb: false, ddd: false} #(I'm getting the obj from API, but this is what I have when I print obj to log)

_.each(Items, function(item){
   if (obj[item.field] === item.val)  
     console.log(obj[item.field],"=",item.val);
});

但我得到undefind=undefined

当我尝试obj['bbb']obj[String(item.field)]时,我得到了值。

另外,请参阅循环中的以下日志:

console.log(typeof item.field, typeof "bbb");
=> string string
console.log(obj["bbb"], obj[item.field], obj[String(item.field)], item.field);
=> false undefined false "bbb" 

有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

要比较对象,只需使用_.isEqual(参见http://underscorejs.org/#isEqual)就更简单了。 Javascript有一些非常奇怪的怪癖,例如http://www.sitepoint.com/javascript-truthy-falsy/

答案 1 :(得分:0)

对象属性名称必须是字符串,任何字符串都是有效的,包括空字符串(除了数字转换为字符串之外,数据的真实情况也是如此(对于示例Items[0]实际上是Items["0"]))。

当您与obj[item.val]进行比较时(对于您提供的示例数组),检查属于boolean的属性名称是无效的。当您改为使用obj[String(item.val)]时,首先将值truefalse转换为字符串,使其变为"true""false"

以下是指向jsfiddle

的链接