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



我有一个数组,看起来像这个

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/但不知道如何使用。

你可以做:

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

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

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

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

您已经提到了关联数组,那就顺其自然吧

如果您对这些数据进行一次读取(允许稍后进行修改)和多次搜索,那么将数组转换为Javascript对象(成为关联数组)就足够了:

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

然后搜索

assocArray[name]

将具有O(1)复杂性,而每次在阵列上循环具有O(n/2)=>O(n)。这将显著加快对此数据的搜索速度。但只有当数据被读取一次并被搜索多次时,这才有意义。新的hashes/targets当然可以稍后添加,也可以更改现有的hashes_targets。

因此,在您的情况下,您只需通过获得产量

assocArray["production"]

然后你会得到与这个hash/target相关联的整个对象。

注意:只有当您有唯一的哈希/目标名称时,这才有效。只要有多个对象具有相同的hash/target,就会返回最后一个。以下是当您的数组中有多个对象具有相同的目标/哈希时的解决方案

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

如果您有多个对象,它们具有相同的hash/target,那么应该稍微更改数组到对象的转换。

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对象),该数组始终返回一个包含一个或多个对象的元素数组。它使以后的操作更容易,因为在任何一种情况下都会返回一个数组。但是可以很容易地改变,在单个结果上,它应该只返回一个对象,而不是一个带有单个元素的数组。

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

我不建议在大型阵列上使用它,但它应该对您有效,或者让您走上正轨。

试试这个函数:

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

Fiddle:http://jsfiddle.net/vUEYA/

最新更新