我有一个这样的数组:
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"
有人知道为什么会这样吗?
答案 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)]
时,首先将值true
或false
转换为字符串,使其变为"true"
或"false"
。
以下是指向jsfiddle
的链接