var myJSON =
{"data":
[{"obj1":"value1",
"obj2":"value2"},
{"obj1":"value3",
"obj2":"value4"},
{"obj1":"value5",
"obj2":"value6"}]
};
我有一个类似于上面的多维数组。在上面的示例中,我可以通过调用value4
获取data[1].obj2
- 在这种情况下密钥为1
。
我的问题:我有value4
,但我没有在数组内部(就密钥而言)。我知道value4
属于obj2
,我需要找到相应的obj1
。
我猜测解决这个问题的方法是找出i
data[i]
对于value4
应该是什么,然后简单地调用data[i].obj1
。但是我如何得到i
?
答案 0 :(得分:3)
我猜测解决这个问题的方法是找出
i
data[i]
对于value4
应该是什么,然后简单地调用data[i].obj1
。
obj2
,你的意思是,不是obj1
。
但是如何获得
i
?
你搜索它。这是一个简单的循环。
var i;
for (i = 0; i < myJSON.data.length; ++i) {
if (myJSON.data[i].obj2 === "value4") {
// Found it
break;
}
}
if (i < myJSON.data.length) {
// Found it, it's at index `i`
}
或者在您可以依赖ES5的forEach
的系统上(或者因为引擎本身存在,或者因为您添加了垫片):
var i;
myJSON.data.forEach(function(entry, index) {
if (entry.obj2 === "value4") {
i = index;
}
};
if (typeof i !== "undefined") {
// Found it
}
你不能提前停止forEach
,这样就会有一些不必要的循环。您可以使用some
:
var i;
myJSON.data.some(function(entry, index) {
if (entry.obj2 === "value4") {
i = index;
return true; // Stops loop
}
};
if (typeof i !== "undefined") {
// Found it
}
答案 1 :(得分:1)
尝试这个简单的递归函数:
find = function(where, what) {
if (typeof where != "object")
return null;
var matches = true;
for (var p in what)
matches = matches && (where[p] == what[p]);
if (matches)
return where;
for (var p in where) {
var found = find(where[p], what);
if(found)
return found;
}
return null;
}
它适用于任何深度的对象,并允许多个搜索键。以你的例子:
var data = {"data":
[{"obj1":"value1",
"obj2":"value2"},
{"obj1":"value3",
"obj2":"value4"},
{"obj1":"value5",
"obj2":"value6"}]
};
result = find(data, {"obj2":"value4"})
console.log(result.obj1) // value3
另一种(更好的)方法是为finder函数提供测试谓词:
find = function(where, test) {
if (test(where))
return where;
if (typeof where != "object")
return null;
for (var p in where) {
var found = find(where[p], test);
if (found)
return found;
}
return null;
}
result = find(data, function(x) { return x.obj2 == "value4" });
答案 2 :(得分:0)
您必须手动浏览对象:
for(var a=0; a<myJSON.data.length; a++)
{
for(var b in myJSON.data[a])
{
if(myJSON.data[a][b]=="value4")
{
console.log("myJSON["+a+"]."+b)
}
}
}
答案 3 :(得分:0)
我建议修改整个数据结构,但假设这是一个抽象的例子。
for(var ei in myJSON["data"]){
if (myJSON["data"][ei]['obj2'] == "value4")){
//ei contains the key
//do something & break;
}
}
这是单线,但速度较慢:
myJSON["data"].map(function(e,i){if(e["obj2"]=="value4")return e;}).filter(Boolean)[0];
或关键:
myJSON["data"].map(function(e,i){if(e["obj2"]=="value4")return i;}).filter(Number)[0];
另请参阅T.J. Crowder
使用some
的答案 - 仍然很慢但避免不必要的周期。
答案 4 :(得分:0)