我在下面具有此功能,可以根据对象的键的值对对象的键进行排序。
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]]
答案 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);