0

我在这里运气不太好。

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

我的代码(包括几个数组元素以便很好地衡量)如下:

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/

4

3 回答 3

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,这是错误的。

于 2013-11-12T18:11:05.333 回答
1

$.grep根据用于查看另一个数组的条件创建一个数组

你要

var newArray= $.grep( laptopsArray, function( n, i ) {
      /* return true or false using a test*/
      return $.inArray( 'BAT', n) !=-1;
  })

DEMO

于 2013-11-12T18:11:57.150 回答
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

这是一个小提琴

编辑:这种方法还具有更好的时间复杂度,因为在对象中的查找O(1)因此整个脚本的复杂度是O(n)O(n^2)数组解决方案中的数组相比

于 2013-11-12T18:20:07.270 回答