jQuery grepping一个数组[]

时间:2013-11-12 18:07:27

标签: javascript jquery arrays

我在这里没有太多运气。

我有一个简单的数组,我正在搜索该数组的一个字段。我最初将它们设置为键:值,但由于某种原因,我无法正确地将数据返回到变量。

我的代码(包括几个用于测量的数组元素)如下:

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] 

这当然是完整的,而不是我所期待的。显然,它是由每个数组元素的每个叶子迭代的。然后吐出真假。对?实际上,我要求它给我的是数组索引。

http://jsfiddle.net/rmacd/YUsBR/

3 个答案:

答案 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?

显然,您应该使用比xyz更好的密钥。

这是fiddle

编辑:此方法也具有更好的时间复杂度,因为对象中的查找为O(1),因此整个脚本的复杂性为O(n) vs O(n^2)对于数组解决方案中的数组