2016-10-10 1 views
2

Я работаю над скриптом, в котором мне приходится сортировать arr массивов на основе второго элемента внутренних массивов. Например здесь ниже я упомянул массив:Сортировка вложенного массива на основе второго значения во внутреннем массиве в Javascript

var newInv = [ 
    [2, "Hair Pin"], 
    [3, "Half-Eaten Apple"], 
    [67, "Bowling Ball"], 
    [7, "Toothpaste"] 
]; 

Я хочу, чтобы отсортировать этот массив на основе всех значений строк во внутренних массивах. Так результат должен быть:

var result = [ 
    [67, "Bowling Ball"], 
    [2, "Hair Pin"], 
    [3, "Half-Eaten Apple"], 
    [7, "Toothpaste"] 
]; 

Для этого я написал следующий сценарий: Есть ли другой способ сделать то же самое? Может быть, без создания объекта?

function arraySort(arr) { 
 

 
    var jsonObj = {}; 
 
    var values = []; 
 
    var result = []; 
 
    for (var i = 0; i < arr.length; i++) { 
 
    jsonObj[arr[i][1]] = arr[i][0]; 
 

 
    } 
 
    values = Object.keys(jsonObj).sort(); 
 

 
    for (var j = 0; j < values.length; j++) { 
 
    result.push([jsonObj[values[j]], values[j]]); 
 
    } 
 
    return result; 
 
} 
 

 
var newInv = [ 
 
    [2, "Hair Pin"], 
 
    [3, "Half-Eaten Apple"], 
 
    [67, "Bowling Ball"], 
 
    [7, "Toothpaste"] 
 
]; 
 

 

 
console.log(arraySort(newInv));

+0

* "без создания объекта JSon «* - Вы не создали« объект JSON »([нет su ch thing] (http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/)), вы создали «объект». – nnnnnn

ответ

4

Вы можете использовать Array#sort

Метод sort() сортирует элементы массива вместо и возвращает массив. Сортировка не обязательно stable. Порядок сортировки по умолчанию соответствует строковым кодам Unicode.

с String#localeCompare

localeCompare() метод возвращает число, указывающее, приходит ли ссылка строки до или после или такой же, как в данной строки в порядке сортировки.

var newInv = [[2, "Hair Pin"], [3, "Half-Eaten Apple"], [67, "Bowling Ball"], [7, "Toothpaste"]]; 
 
    
 
newInv.sort(function (a, b) { 
 
    return a[1].localeCompare(b[1]); 
 
}); 
 

 
console.log(newInv);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

Спасибо за быстрое решение с прекрасным объяснением. Это действительно полезно. – Madhusudan

3

Конечно, как это, используя Array «s sort() метод:

newInv.sort((a, b) => a[1].localeCompare(b[1])); 

Вот отрывок:

var newInv = [ 
 
    [2, "Hair Pin"], 
 
    [3, "Half-Eaten Apple"], 
 
    [67, "Bowling Ball"], 
 
    [7, "Toothpaste"] 
 
]; 
 

 
newInv.sort((a, b) => a[1].localeCompare(b[1])); 
 

 
console.log(newInv);

+0

ПРИМЕЧАНИЕ: Это синтаксис ES6 – mplungjan

+0

@Robby Спасибо :) – Madhusudan

0

Дубликат sort outer array based on values in inner array, javascript здесь вы найдете несколько ответов, как и мои собственные

var arr = [.....] 
arr.sort((function(index){ 
    return function(a, b){ 
     return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1)); 
    }; 
})(2)); // 2 is the index 

Сортирует по индексу 2

Смежные вопросы