1

我一直对如何从数组文字中正确检索属性值感到困惑。

对象字面量:

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

4 回答 4

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小提琴

于 2013-09-12T15:04:55.527 回答
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]);
    }
  }
}
于 2013-09-12T15:02:51.507 回答
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()

于 2013-09-12T15:05:16.200 回答
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');
}

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

于 2013-09-12T15:21:36.280 回答