在Javascript中搜索关联数组/哈希

时间:2013-08-10 15:11:33

标签: javascript jquery

我有一个看起来像这样的数组

var data = [
 {"target": "production", "datapoints": [[165.0, 136], [141.0, 176], [null, 176]]},
 {"target": "test", "datapoints": [[169.0, 100], [151.0, 160], [null, 120]]},
 {"target": "backup", "datapoints": [[1.0, 130], [32.0, 120], [13.0, 130]]}
]

是否可以搜索此数组以返回包含例如"production"

的哈希值
{"target": "production", "datapoints": [[165.0, 136], [141.0, 176], [null, 176]]}

我查看了这个http://api.jquery.com/jQuery.inArray/,但不知道如何使用它。

5 个答案:

答案 0 :(得分:6)

你可以这样做:

var target = "production";
var result = $.grep(data, function(e){ return e.target == target; });

console.log(result);

答案 1 :(得分:3)

不确定这是不是你的意思,但试试这个:

for(var i=0;i<data.length;i++) 
    if(data[i].target=='production') 
        return data[i]
        // or do something else/more

这将遍历数组,并检查“target”属性的值“production

答案 2 :(得分:3)

您已经提到过关联数组,所以就是

如果您正在进行一次读取(允许以后进行修改)并且很多时间搜索此数据,那么实际您的数组转换为Javascript对象就足够了(成为一个关联数组):

var assocArray = {};
for(var i = 0; i < data.length; i++)
{
    assocArray[data[i].target] = data[i];
}

然后搜索

assocArray[name]
每次具有O(n / 2)=&gt;时,

将具有O(1)复杂度,同时在数组上循环。上)。这将显着加快对此数据的搜索。但这只有在数据读取一次并多次搜索时才有意义。当然可以在以后添加新的哈希/目标,也可以更改现有的哈希/目标。

因此,在您的情况下,您只需通过

获取生产
assocArray["production"]

并且您将获得与此哈希/目标相关联的整个对象。

  

注意:仅当您具有唯一的哈希/目标名称时才有效。每当你有几个具有相同散列/目标的对象时,将返回最后一个。当您在阵列中有多个具有相同目标/散列的对象时,以下是一种解决方案。

每个哈希/目标的多个结果

如果你有几个具有相同散列/目标的对象,你的数组到对象的转换应该稍微改变一下。

var assocArray = {};
for(var i = 0; i < data.length; i++)
{
    // doesn't exist? create array
    if (!assocArray[data[i].target])
    {
        assocArray[data[i].target] = [];
    }

    // push an element
    assocArray[data[i].target].push(data[i]);
}

这将创建一个关联数组(Javascript对象),它始终返回带有一个或多个对象的元素数组。它使后面的操作更容易,因为在任何一种情况下都返回一个Array。但是可以很容易地改变它在单个结果上它应该只返回一个对象而不是一个具有单个元素的数组。

答案 3 :(得分:0)

function findHash(hash, data) {
  var dataLen = data.length;
  for(dataLen > 0; dataLen--;) {
    if( data[dataLen].target == hash) {
      return data[dataLen];
    }
  }
  return false;
}

我不建议在大型阵列上使用它,但它应该适合您或让您走上正确的轨道。

答案 4 :(得分:0)

尝试此功能:

var getDataByTarget = function (target) {
    var ret = false;
    $.each(data, function () {
        if (this.target == target) {
            ret = this;
            return false;
        }
    });
    return ret;
};

小提琴:http://jsfiddle.net/vUEYA/