我在这里没有太多运气。
我有一个简单的数组,我正在搜索该数组的一个字段。我最初将它们设置为键:值,但由于某种原因,我无法正确地将数据返回到变量。
我的代码(包括几个用于测量的数组元素)如下:
var laptopsArray = [];
laptopsArray[0] = ['123','Missing','CON','L'];
laptopsArray[1] = ['124', 'Home', 'BAT', 'I'];
laptopsArray[2] = ['125', 'Missing', 'CON', 'O'];
laptops = [];
for (i = 0; i < laptopsArray.length; i++) {
$.grep( laptopsArray[i], function( n, i ) {
laptops.push ( n === 'BAT');
});
}
console.log(laptops);
搜索“BAT”(如上所示)在控制台中返回以下内容:
[false, false, false, false, false, false, true, false, false, false, false, false]
这当然是完整的,而不是我所期待的。显然,它是由每个数组元素的每个叶子迭代的。然后吐出真假。对?实际上,我要求它给我的是数组索引。
答案 0 :(得分:1)
laptops = $.grep(laptopsArray, function(arr) {
return ~$.inArray("BAT", arr);
});
$.grep
基本上是jQuery的Array.prototype.filter
版本。因此,您需要grep外部数组,并返回检查每个嵌套数组的结果。
以下是本机ECMAScript 5代码的外观:
laptops = laptopsArray.filter(function(arr) {
return ~arr.indexOf("BAT");
});
~
技巧只是确保测试没有返回-1
的一种较短方法。如果是的话,它会被转换为0
,这是假的。
答案 1 :(得分:1)
$.grep
根据您用来查看另一个数组
你想要
var newArray= $.grep( laptopsArray, function( n, i ) {
/* return true or false using a test*/
return $.inArray( 'BAT', n) !=-1;
})
的 DEMO 强>
答案 2 :(得分:0)
您是否考虑过将其存储在对象中,看起来它会更合适。看起来每台笔记本电脑都具有相同的属性,看起来每个笔记本电脑都有一个id。我会建议这样的事情。
var laptops = [];
laptops[0] = {
id: 123,
x: 'Missning',
y: 'CON',
z: 'L'
};
laptops[1] = {
id: 124,
x: 'Home',
y: 'BAT',
z: 'I'
};
laptops[2] = {
id: 125,
x:'Missing',
y: 'CON',
z:'O'
};
var result = $.grep(laptops, function (x) { return x.y === 'BAT' });
console.log(result);
console.log(result.length === 0); //Empty?
显然,您应该使用比x
,y
和z
更好的密钥。
这是fiddle。
编辑:此方法也具有更好的时间复杂度,因为对象中的查找为O(1)
,因此整个脚本的复杂性为O(n)
vs O(n^2)
对于数组解决方案中的数组