Сортировать каждый объект внутри массива объектов по его значениям - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть эта функция ниже для сортировки ключей объекта в соответствии с их значениями.

var obj = {"A": 50, "B": 10, "C": 150 };

var ordered = Object.keys(obj).sort(function(a,b) {
            return obj[a] > obj[b] ? -1 :
                   obj[b] > obj[a] ? 1 : 0;
        });

console.log(ordered); // => [C, A, B];

Однако, когда у меня есть массив объектов, эта функция ничего не возвращает.

ДляМассив объектов, подобных этому ниже:

var objs = [
    {"A": 50, "B": 10, "C": 150 },
    {"A": 60, "B": 100, "C": 10 },
    {"A": 150, "B": 100, "C": 30 } 
]

Я пробовал что-то вроде этого:

let op =[];
objs.forEach((obj) => {
    let ordered = {};
     Object.keys(obj).sort().forEach((a,b) => {
      ordered = obj[a] > obj[b] ? -1 : obj[b] > obj[a] ? 1 : 0;
    });
  op.push(ordered);
});

console.log(op);

Но эта функция возвращает ошибку: Идентификатор 'op' уже былЗаявлено.

Мне нужно вернуть что-то похожее на пример выше, но применить к каждому объекту.Результат будет:

console.log(ordered); // => [[C, A, B], [B, A, C], [A, B, C]]

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Невозможно воспроизвести ошибку, которую вы описали, но есть другой способ сделать это, используя Object.entries() с некоторой деструктурой :

const objs = [
    {"A": 50, "B": 10, "C": 150 },
    {"A": 60, "B": 100, "C": 10 },
    {"A": 150, "B": 100, "C": 30 } 
];

const ordered = objs.map(o => Object.entries(o)
                                    .sort(([k1, v1], [k2, v2]) => v2 - v1)
                                    .map(([k]) => k));

console.log(ordered);
0 голосов
/ 28 декабря 2018

В вашем коде вы помещаете логику сортировки в forEach, которая не будет работать.Поскольку у вас уже есть сортировка, которая работает для вас, чтобы получить желаемый результат, вы можете просто сделать его функцией и map по массиву:

function ordered(obj) {
  return Object.keys(obj).sort(function(a, b) {
    return obj[a] > obj[b] ? -1 :
      obj[b] > obj[a] ? 1 : 0;
  });
}


var objs = [
    {"A": 50, "B": 10, "C": 150 },
    {"A": 60, "B": 100, "C": 10 },
    {"A": 150, "B": 100, "C": 30 } 
]


console.log(objs.map(ordered))

Если вы предпочитаете код forEach, вам просто нужна пара изменений:

var objs = [
    {"A": 50, "B": 10, "C": 150 },
    {"A": 60, "B": 100, "C": 10 },
    {"A": 150, "B": 100, "C": 30 } 
]

let op =[];

objs.forEach((obj) => {                                // just on forEach
    let ordered = Object.keys(obj).sort((a, b) => 
        obj[a] > obj[b] ? -1 : obj[b] > obj[a] ? 1 : 0 // sort 
    )
    op.push(ordered);                                  // push sorted array
});

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