从数组文字中检索属性值

时间:2013-09-12 14:59:05

标签: javascript arrays object

我一直不知道如何从数组文字中正确检索属性值。

对象文字:

var obj = {
    "p1": "v1",
    "p2": "v2",
    "p3": "v3"
};

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        console.log(key + " -> " + obj[key]);
    }
}

控制台日志输出:

p1 -> v1
p2 -> v2
p3 -> v3

数组文字:

var obj = [
    { "pa":"va1", "pb":"vb1" },
    { "pa":"va2", "pb":"vb2" },
    { "pa":"va3", "pb":"vb3" },
    { "pa":"va4", "pb":"vb4" }
];

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        console.log(key + " -> " + obj[key]);
    }
}

控制台日志输出(呃!):

0 -> [object Object]
1 -> [object Object]
2 -> [object Object]
3 -> [object Object]

我正在尝试做什么: 检查字符串是否与pa之一匹配。如果是,请做点什么。

这就是逻辑:

var myString = "a value I'm getting from somewhere else ;)"
if (myString == any of the pa values) {
    // do something
}

任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:4)

使用filter方法(链接包含代码以向旧浏览器添加功能 - IE8及更早版本),然后检查结果数组的长度:

var obj = [
    { "pa":"va1", "pb":"vb1" },
    { "pa":"va2", "pb":"vb2" },
    { "pa":"va3", "pb":"vb3" },
    { "pa":"va4", "pb":"vb4" }
];

var filtered = obj.filter(function(element) { 
    return element.pa === myString;
});

if (filtered.length > 0) {
   // contains string
}

JS Fiddle

答案 1 :(得分:2)

obj不是您期望的对象,它是一个对象数组。您需要迭代数组,然后迭代每个数组项中的键。

var i, key;

for (i = 0; i < obj.length; i++) {
  for (key in obj[i]) {
    if (obj[i].hasOwnProperty(key) {
      console.log(key + " -> " + obj[i][key]);
    }
  }
}

答案 2 :(得分:0)

如果您不需要知道父级,那么可能可以提升性能,而不是循环使用它(取决于数组和对象大小)。如果添加了另一个嵌套级别的对象,这也将消除更改代码的需要。

JSON.stringify(obj).indexOf(':"pa1"')>-1

JSON.stringify()将您的数组转换为如下字符串:

"[{"pa":"va1","pb":"vb1"},{"pa":"va2","pb":"vb2"},{"pa":"va3","pb":"vb3"},{"pa":"va4","pb":"vb4"}]"

我们当然可以通过

进行正常的文本搜索

IE8及以上版本支持JSON.stringify()

答案 3 :(得分:0)

这可能过于简单了,但如果您只是想知道mystring中是否有一个字符串是数组中的项目,那么该数组可以通过字符串索引进行寻址。

更新 - 我通过firebug运行此操作,发现我的符号不正确,因为此方法按照我认为应该的方式工作 - 即作为标签对象或值的可参考列表。

var obj = [];
obj["val1"] = "pa";
obj["val2"] = "pb";

mystring="val1";

if (obj[mystring]){
   alert ('object exists in array');
}
else{
    alert('object with index ' + mystring + ' does not exist');
}

不需要循环,但必须更改阵列设置以支持这种“查找”方法。