按值对对象数组中的每个对象进行排序

时间:2018-12-28 01:28:11

标签: javascript arrays sorting object

我在下面具有此功能,可以根据对象的键的值对对象的键进行排序。

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 :(得分:1)

无法重现您描述的错误,但这是另一种解决方法,将Object.entries()与某些destructuring结合使用:

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);

答案 1 :(得分:0)

在您的代码中,您正在将排序逻辑放入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);