2
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呢?

4

5 回答 5

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(或者因为引擎本身就有它,或者因为你添加了一个 shim):

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
}
于 2013-11-10T10:51:19.760 回答
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" });
于 2013-11-10T10:53:32.763 回答
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)
  }
 }
}
于 2013-11-10T10:49:56.223 回答
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

于 2013-11-10T11:10:49.623 回答
0

如果您使用的是 jQuery,那么您可以使用grep函数来执行您的搜索:

var searchValue = "value4";

var result = $.grep(myJSON.data, function (e) { 
        return e.obj2 === searchValue;
    });

console.log(result[0].obj1);

有关工作示例,请参见此处。

于 2015-10-11T00:27:33.800 回答