2013-11-12 3 views
0

Мне не повезло.jQuery grepping array []

У меня есть простой массив, и я ищу одно поле этого массива. Первоначально я установил их как ключ: значения, но по какой-то причине я не смог правильно вернуть данные в переменную.

Мой код (в том числе нескольких элементов массива для хорошей меры) выглядит следующим образом:

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/

ответ

1

$.grep создает массив на основе условий, которые вы используете, чтобы посмотреть через другой массив

Вы хотите

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

DEMO

+0

Wow. Просто так. Здесь я собирался сделать еще несколько вещей этим вечером, думая, как и любой другой форум, что ответы будут появляться через несколько часов ...буквально секунд, больше нравится. Спасибо! Таким образом, другими словами, я должен был посмотреть, что будет выдавать результат $ .grep - в данном случае другой массив. Это имеет смысл. – Ron

+0

, когда есть сомнения ... jQuery API имеет отличные документы и некоторые примеры для каждого метода – charlietfl

+0

и да ... хорошо сконструированные вопросы, такие как ваши, которые содержат краткую проблему и попытку решить с помощью сопроводительного кода, получите быстрый ответ здесь. – charlietfl

1
laptops = $.grep(laptopsArray, function(arr) { 
    return ~$.inArray("BAT", arr); 
}); 

The $.grep в основном версия JQuery о Array.prototype.filter. Таким образом, вы захотите выполнить grep внешний массив и вернуть результат проверки каждого вложенного массива для значения.


Вот как это выглядит в родной, ECMAScript 5 Код:

laptops = laptopsArray.filter(function(arr) { 
    return ~arr.indexOf("BAT"); 
}); 

~ трюк просто короткий способ убедиться, что тест не вернулся -1. Если это так, оно преобразуется в 0, что является ложным.

0

Рассматривали ли вы хранить это в объектах вместо его похоже, было бы гораздо более подходящим. Кажется, что каждый ноутбук имеет одинаковые атрибуты, и он также выглядит так, как будто у каждого есть свой идентификатор. Я бы предложил что-то подобное.

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.

EDIT: Этот подход также имеет лучшую временную сложность, поскольку поиск в объектах является O(1) таким образом, сложность всего сценария O(n) против O(n^2) для массива в растворе массива