Javascript / jQuery:在嵌套数组中按值获取键

时间:2013-11-10 10:40:36

标签: javascript arrays multidimensional-array

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

5 个答案:

答案 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)

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

var searchValue = "value4";

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

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

有关工作示例,请参阅here