Сортировать трехмерный массив в Javascript - PullRequest
2 голосов
/ 23 января 2012

Рассмотрим этот массив

var LIST =[];

LIST['C']=[];
LIST['B']=[];

LIST['C']['cc']=[];
LIST['B']['bb']=[];  

LIST['C']['cc'].push('cc0');
LIST['C']['cc'].push('cc1');
LIST['C']['cc'].push('cc2');
LIST['B']['bb'].push('bb0');
LIST['B']['bb'].push('bb1');
LIST['B']['bb'].push('bb2');

Я могу перебрать этот массив как

  for(var i in LIST){

      console.log(i)//C,B
      var level1=LIST[i];

      for(var j in level1){
        console.log(j)//cc,bb
        // etc...
      }

   }

Хорошо .. У меня есть несколько основных вопросов.

1.Как отсортировать массив на каждом уровне?

Один уровень можно отсортировать методом .sort (fn). Как я могу перейти на внутренние уровни?

2.Почему метод indexOf не работает для поиска элементов на первых двух уровнях?

Если это из-за нестрокового параметра ... как я могу искать элементы массива в массиве, если элемент не является строкой?

3. Как for(var i in LIST) работает? Мне просто нужно базовое понимание индексации и циклического перемещения по массиву.

Спасибо ..

Ответы [ 3 ]

1 голос
/ 23 января 2012

Вы должны знать, что Array наследуется от Object.

. В JavaScript любой экземпляр Object является ассоциативным массивом (!), Поэтому действует как массив в PHP.Например:

var o = {}; // or new Object();
o['foo'] = 'bar';
o[0] = 'baz';
for (i in o) { console.log(i, o[i]); }

Сортировка Object не имеет большого смысла.indexOf вроде бы работает теоретически, но не реализовано.

Arrays - упорядоченные списки.Array экземпляры имеют push(), length, indexOf(), sort() и т. Д., Но они работают только для числовых индексов.Но опять же, Array наследуется от Object, поэтому любой массив также может содержать нечисловые индексные записи:

var a = []; // or new Array();
a[0] = 'foo'; // a.length is now 1
a.push('baz'); // a[1] === 'baz'
a.qux = 1; // will not affect a.length
a.sort(); // will not affect a.qux
for (i in a) { console.log(i, a[i]); }

Я рекомендую поиграть с массивами и объектами, и вы скоро поймете.

1 голос
/ 25 января 2012

LIST - это НЕ трехмерный массив в Javascript, это просто массив.

//declare an array which names LIST.
var LIST = [];

//set a property named 'C' of the LIST to be an array.
LIST['C']=[];
//set a property named 'B' of the LIST to be an array.
LIST['B']=[];

//set a property named 'cc' of the 'LIST.C'(which is an array object)
LIST['C']['cc']=[];
//set a property named 'bb' of the 'LIST.B'(which is an array object)
LIST['B']['bb']=[];  

Дело в том, что вам нужно только чтобы последний уровень былмассив, см. мой пример кода ниже.

function iterateOrderd(obj) {
    if (obj instanceof Array) {
        obj.sort();
        for (var j = 0, l=obj.length; j < l; j++) {
            console.log(obj[j]);
        }
    } else {
        var sortable = [];
        for (var i in obj) {
            if (obj.hasOwnProperty(i)) {
                sortable.push(i);
            }
        }
        sortable.sort();
        for (var j = 0, l=sortable.length; j < l; j++) {
            console.log(sortable[j]);
            iterateOrderd(obj[sortable[j]]);
        }
    }
}


var LIST = {};

LIST['C'] = {};
LIST['B'] = {};

LIST['C']['cc']=[];
LIST['B']['bb']=[];  

LIST['C']['cc'].push('cc0');
LIST['C']['cc'].push('cc1');
LIST['C']['cc'].push('cc2');
LIST['B']['bb'].push('bb0');
LIST['B']['bb'].push('bb1');
LIST['B']['bb'].push('bb2');

iterateOrderd(LIST);
0 голосов
/ 23 января 2012

Каковы ваши критерии сортировки?Я имею в виду, как вы скажете массив firstArray до secondArray?что касается for (counter in myArray), counter будет принимать значения элемента массива на каждой итерации.

for (counter in [0,1,5]), счетчик будет иметь значения 0, 1 и 5 на 3 итерациях.

В вашем случае i будет иметь значения LIST['B'] и LIST['C'] в двух итерациях, а j будет иметь значения LIST['B']['bb'], LIST['B']['cc'], LIST['C']['bb'] и LIST['C']['cc'].

Оба i и jбудут массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...