2017-01-16 4 views
1

У меня есть массив объектов, выглядит следующим образом:Javascript - сортировка объектов массива по ключу объекта недвижимости

var array = [{ 
key: {name: "C Some name", id: 123}, 
value: {value: 1, element:"some element"} 
}, { 
key: {name: "A Name 2", id: 1234}, 
value: {value: 4, element:"some element 2"} 
}, { 
key: {name: "B Other name", id: 1235}, 
value: {value: 2, element:"some element 3"} 
}] 

Я хочу, чтобы отсортировать этот массив по имени (внутри ключевого объекта) и значение (внутри объекта значения) , Результат сортировать по имени должен вернуть этот результат:

[{ 
key: {name: "A Name 2", id: 1234}, 
value: {value: 4, element:"some element 2"} 
}, { 
key: {name: "B Other name", id: 1235}, 
value: {value: 2, element:"some element 3"} 
}, { 
key: {name: "C Some name", id: 123}, 
value: {value: 1, element:"some element"} 
}] 

И результат сортировать по значению должен выглядеть следующим образом:

[{ key: {name: "C Some name", id: 123}, 
    value: {value: 1, element:"some element"} 
}, { 
key: {name: "B Other name", id: 1235}, 
    value: {value: 2, element:"some element 3"} 
}, { 
key: {name: "A Name 2", id: 1234}, 
    value: {value: 4, element:"some element 2"} 
}] 

Я попробовал это для сортировать по имени:

array.sort(a,b){ 
return a.key["name"] - b.key["name"]; 
} 

И это для сортировки по значению:

array.sort(a,b){ 
return a.key["value"] - b.key["value"]; 
} 

но не работает. Как я могу отсортировать этот массив?

+1

'a.key [имя]' означает, что у вас есть какой-то переменную ' name', и вы хотите получить доступ к свойству 'a.key' с этим совпадающим именем. Вы пробовали 'a.key.name' для получения правильного значения? –

+0

Я должен, вероятно, задать в своем вопросе a.key ["name"] то, что равно a.key.name – snoopy25

ответ

2

Вы должны сравнить строки с >.

var array = [{ 
 
    key: {name: "C Some name", id: 123}, 
 
    value: {value: 1, element:"some element"} 
 
}, { 
 
    key: {name: "A Name 2", id: 1234}, 
 
    value: {value: 4, element:"some element 2"} 
 
}, { 
 
    key: {name: "B Other name", id: 1235}, 
 
    value: {value: 2, element:"some element 3"} 
 
}]; 
 

 
var newArray = array.sort(function(first, second) { 
 
    var a = first.key.name; 
 
    var b = second.key.name; 
 
    
 
    if(a > b) { 
 
     return 1; 
 
    } else if(a < b) { 
 
     return -1; 
 
    } else { 
 
     return 0; 
 
    } 
 
}); 
 

 
console.log(newArray);

+0

Почему downvote? –

+1

С должным уважением к модераторам, иногда умеренность чрезмерна! – Agalo

1

Один из способов идти, как это.

В основном, с помощью функции Стрелка для Сортировка обратного вызова, а затем сравнивая 2 string с помощью localeCompare.
first.key.name.localeCompare(second.key.name)

Для целых значений вы можете напрямую сравнить их, выполнив вычитание.
first.value.value - second.value.value.

Важно знать, как Comparer функция работает для 2 значений a и b.

  • Менее 0: Сортировка a быть ниже, чем индекс b.

  • Нуль: a и b следует считать равным, и сортировка не производится.

  • Больше 0: Сортировать b быть ниже, чем индекс a

var array = [{ 
 
key: {name: "C Some name", id: 123}, 
 
value: {value: 1, element:"some element"} 
 
}, { 
 
key: {name: "A Name 2", id: 1234}, 
 
value: {value: 4, element:"some element 2"} 
 
}, { 
 
key: {name: "B Other name", id: 1235}, 
 
value: {value: 2, element:"some element 3"} 
 
}] 
 

 
var resultSortedByName = array.sort((first,second) => {return first.key.name.localeCompare(second.key.name)}); 
 
console.log(resultSortedByName); 
 

 
var resultSortedByValue = array.sort((first,second) => {return (first.value.value - second.value.value)}); 
 
console.log(resultSortedByValue);

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