Группировать элементы массива на основе переменной javascript - PullRequest
11 голосов
/ 29 сентября 2011

У меня есть массив, который создается динамически из документа xml и выглядит примерно так:

myArray[0] = [1,The Melting Pot,A]
myArray[1] = [5,Mama's MexicanKitchen,C]
myArray[2] = [6,Wingdome,D]
myArray[3] = [7,Piroshky Piroshky,D]
myArray[4] = [4,Crab Pot,F]
myArray[5] = [2,Ipanema Grill,G]
myArray[6] = [0,Pan Africa Market,Z]

Этот массив создается в цикле for и может содержать все, что основано на документе xml

Что мне нужно сделать, так это сгруппировать элементы из этого массива по буквам так, чтобы все объекты массива, в которых была буква A, сохранялись в другом массиве, как это

other['A'] = ['item 1', 'item 2', 'item 3'];
other['B'] = ['item 4', 'item 5'];
other['C'] = ['item 6'];

Для пояснения мне нужносортировать элементы на основе переменных из массива, в данном случае букв, чтобы все объекты массива, содержащие букву А, проходили под новым массивом по буквам

Спасибо за любую помощь!

Ответы [ 6 ]

10 голосов
/ 29 сентября 2011

Вы не должны использовать массивы с нецелыми индексами.Ваша переменная other должна быть простым объектом, а не массивом.(Он работает с массивами, но это не лучший вариант.)

// assume myArray is already declared and populated as per the question

var other = {},
    letter,
    i;

for (i=0; i < myArray.length; i++) {
   letter = myArray[i][2];
   // if other doesn't already have a property for the current letter
   // create it and assign it to a new empty array
   if (!(letter in other))
      other[letter] = [];

   other[letter].push(myArray[i]);
}

Учитывая элемент в myArray [1, «Плавильный котел», «A»], ваш пример неВыясните, хотите ли вы сохранить все это в other или просто строковое поле во второй позиции массива - ваш пример вывода содержит только строки, но они не соответствуют вашим строкам в myArray.Мой код изначально хранил только строковую часть, сказав other[letter].push(myArray[i][1]);, но какой-то анонимный человек отредактировал мой пост, изменив его на other[letter].push(myArray[i]);, в котором хранятся все [1, "The Melting Pot", "A"].До вас, чтобы выяснить, что вы хотите сделать там, я дал вам основной код, который вам нужен.

6 голосов
/ 01 ноября 2012

Попробуйте функцию groupBy, предложенную http://underscorejs.org/#groupBy

_.groupBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); });

Result => {1: [1.3], 2: [2.1, 2.4]}
2 голосов
/ 29 сентября 2011

Вы должны создать пустой объект JavaScript и назначить ему массив для каждой буквы.

var object = {};

for ( var x = 0; x < myArray.length; x++ )
{
    var letter = myArray[x][2];

    // create array for this letter if it doesn't exist
    if ( ! object[letter] )
    {
        object[letter] = [];
    }

    object[ myArray[x][2] ].push[ myArray[x] ];
}

Демонстрационная скрипка здесь .

1 голос
/ 29 сентября 2011

Добрый день, ES5 Array Дополнения - это здорово.

var other = {};
myArray.forEach(function(n, i, ary){
    other[n[2]] = n.slice(0,2);
});
1 голос
/ 29 сентября 2011

Этот код будет работать для вашего example.

var other = Object.create(null),  // you can safely use in opeator.
    letter,
    item,
    max,
    i;

for (i = 0, max = myArray.length; i < max; i += 1) {
   item = myArray[i];
   letter = myArray[2];

   // If the letter does not exist in the other dict,
   // create its items list
   other[letter] = other[letter] || [];
   other.push(item);
}
0 голосов
/ 29 сентября 2011

Попробуйте -

var myArray = new Array();
myArray[0] = [1,"The Melting Pot,A,3,Sake House","B"];
myArray[1] = [5,"Mama's MexicanKitchen","C"];
myArray[2] = [6,"Wingdome","D"];
myArray[3] = [7,"Piroshky Piroshky","D"];
myArray[4] = [4,"Crab Pot","F"];
myArray[5] = [2,"Ipanema Grill","G"];
myArray[6] = [0,"Pan Africa Market","Z"];

var map = new Object();
for(i =0 ; i < myArray.length; i++){
    var key = myArray[i][2];
    if(!map[key]){
       var array = new Array();        
        map[key] = array;
    }
    map[key].push(myArray[i]);

}
...