Как отсортировать объект по значениям с помощью нескольких ключей? - PullRequest
0 голосов
/ 04 апреля 2019

Я хочу использовать метод сортировки, описанный здесь , но у меня есть

{
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
}

Я создал эту функцию, где я группирую каждую строку вместе и добавляю счетчик (как значение для ключа, см. Выше)

function generateCountDuplication(wordArray) {
  const countedWords = wordArray.reduce(function(allWords, word) {
    if (word in allWords) {
      allWords[word]++;
    }
    else {
      allWords[word] = 1;
    }
    return allWords;
  }, {});
  return countedWords;
}

Я пытался зайти в Google и посмотреть здесь на Stackoverflow, но не нашел ни одного, где можно отсортировать по значению , когда ключ не уникален . Любая подсказка, как решить?

Я хочу это в результате:

{
  "TUBE": 1,
  "DCS": 2,
  "BREAKOUT": 6,
  "RAISING": 8,
  "REAR": 61,
  "TOWER": 65,
  "JACKS": 84,
  "FEED": 114,
  "INSTALLATION": 119,
  "ASSEMBLY": 326,
  "JACK": 334,
  "HYDRAULIC": 1421,
  "CYLINDER": 2986
}

Ответы [ 5 ]

3 голосов
/ 04 апреля 2019

Unsing Object.keys() и map следующим образом вы можете достичь ожидаемого результата.

const list = {
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
};

var newList = {};
Object.keys(list).sort(function(a,b){return list[a]-list[b]})
                 .map(key => newList[key] = list[key]);
console.log(newList);
2 голосов
/ 04 апреля 2019

Object.entries и forEach, так как map не самый подходящий метод для копирования значений ключа

и, как упомянуто epascarello , вам лучше использовать фактический массив, так как вам не следует полагаться на порядок ключей в объекте

const list = {
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
},newList = {}

Object.entries(list).sort((a,b) => a[1]-b[1])
  .forEach(elm => newList[elm[0]] = elm[1])

console.log(newList);
1 голос
/ 04 апреля 2019

Первое, что вам нужно сделать, это превратить свойства ваших объектов в массив, что-то в форме

[
   {word: "CYLINDER", count: 2986},
   {word: "HYDRAULIC", count: 4421}
   // etc
]

Затем вы можете использовать сортировку.

var input = {
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
};

var result = Object.keys(input)
                   .map( x => ({word:x, count:input[x]}))
                   .sort( (a,b) => a.count - b.count);
console.log(result);
0 голосов
/ 04 апреля 2019

комбинат Object.keys(obj), .sort() & .map

const obj = {
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
}

var sorted = {};

console.log("Un-sorted", obj);

Object.keys(obj).sort().map(function(key){
  sorted[key] = obj[key];
});

console.log("Sorted", sorted)

Я уверен, что есть более элегантное решение, но оно тоже работает.

0 голосов
/ 04 апреля 2019

Как объяснено в связанном документе, функция sort принимает аргумент, то есть функцию сравнения.Итак, если вы хотите отсортировать массив объектов по их ключу INSTALLATION, вы можете просто сделать:

array.sort(function(a,b) {return a.INSTALLATION - b.INSTALLATION})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...