我有一个数组,看起来像这个
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/