简体   繁体   English

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

[英]Sort each Object inside Array of Objects by its values

I have this function below to sort the keys of an object accordly their values.我在下面有这个函数来根据它们的值对对象的键进行排序。

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

However, when I have an Array of Objects, this function returns nothing.但是,当我有一个对象数组时,此函数不返回任何内容。

For an Array of objects like this below:对于如下所示的对象数组:

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

I have tried something like this:我试过这样的事情:

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

But this function returns an error: Identifier 'op' has already been declared.但是这个函数返回一个错误:标识符'op'已经被声明。

I need to return something similar to the example above, but applied to each object.我需要返回类似于上面示例的内容,但适用于每个对象。 The result would be:结果将是:

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

Cannot reproduce the error you describe, but here's another way to do it, using Object.entries() with some destructuring :无法重现您描述的错误,但这是另一种方法,使用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);

In your code you are putting the sort logic in the forEach which isn't going to work.在您的代码中,您将排序逻辑放在forEach ,这将不起作用。 Since you already have a sort that works for you, to get your desired output, you can just make it a function and map it over the array:由于您已经有一个适合您的排序,为了获得您想要的输出,您可以将它设为一个函数并将其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))

If you prefer the forEach code, you just need a couple changes:如果您更喜欢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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM