2

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

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

4

5 回答 5

6

你可以做:

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

console.log(result);
于 2013-08-10T15:18:50.537 回答
3

你提到了关联数组,就这样吧

如果您正在进行一次性读取(允许以后修改)并多次搜索此数据,则将数组实际转换为 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)。这将显着加快对这些数据的搜索。但这仅在读取一次数据并多次搜索时才有意义。当然,以后可以添加新的哈希/目标,或者也可以更改现有的哈希/目标。

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

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

于 2013-08-10T15:21:13.810 回答
3

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

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

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

于 2013-08-10T15:16:39.347 回答
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/

于 2013-08-10T15:18:58.643 回答
0
function findHash(hash, data) {
  var dataLen = data.length;
  for(dataLen > 0; dataLen--;) {
    if( data[dataLen].target == hash) {
      return data[dataLen];
    }
  }
  return false;
}

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

于 2013-08-10T15:17:39.163 回答