我创建了一系列具有重复数据的食物名称。使用:
listFoodnames.forEach(x => {
counts[x] = (counts[x] || 0) + 1;
});
我可以计算数组中每个项目存在的次数。
使用:
Object.keys(counts).sort((a, b) => counts[b]-counts[a])
我可以将项目的数量从最大到最低排序,但是,我失去了我想保留的实际数量。
我该如何解决这个问题?
$('document').ready(function() {
var listFoodnames = ["Batteries", "Bread", "Milk", "Bread", "Milk", "Milk"]
var counts = {};
listFoodnames.forEach(x => {
counts[x] = (counts[x] || 0) + 1;
});
console.log(counts) //LOGS EACH ITEM AS PROPERTY AND OCCURRENCES AS VALUE
var sortedCounts = Object.keys(counts).sort((a, b) => counts[b]-counts[a])
console.log(sortedCounts) //LOSES VALUES
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 0 :(得分:4)
不幸的是,根据规范,不保证订购对象属性。您可以尝试使用对象数组。
另请注意,当您将数组中的项目合并为单个对象时,reduce
比forEach
更合适。
const listFoodnames = ["Batteries", "Bread", "Milk", "Bread", "Milk", "Milk"];
const counts =
Object.values(
listFoodnames.reduce((a, foodName) => {
if (!a[foodName]) a[foodName] = { foodName, count: 0 };
a[foodName].count++;
return a;
}, {})
);
counts.sort((a, b) => a.count - b.count);
console.log(counts);
答案 1 :(得分:2)
而不是
var sortedCounts = Object.keys(counts).sort((a, b) => counts[b] - counts[a]);
使用
var sortedCounts = Object.entries(counts).sort(([keyA, a], [keyB, b]) => b - a);
接下来,您可以将每个[key, value]
条目映射到新对象:
console.log(sortedCounts.map(([key, value]) => ({[key]: value})));
结果如下:
[
{
"Milk": 3
},
{
"Bread": 2
},
{
"Batteries": 1
}
]
注意,不可能得到像
这样的东西{
"Milk": 3,
"Bread": 2,
"Batteries": 1
}
工作,因为对象属性没有订单。
答案 2 :(得分:1)
每个回复的人都错误地说 - &gt; dictionaries are not ordered
这实际上是错误的,ES6进行了规范更改,并且已经说了字典的订购。虽然在没有指定ES6订单之前,大多数浏览器都做了订单。顺便说一下顺序是插入顺序。订单也可以在序列化时使用,例如。 JSON.parse / JSON.stringify。
因此,使用这些知识,我们可以将结果制作出你的格式,一个已排序的对象。
以下示例。
var listFoodnames = ["Batteries", "Bread", "Milk", "Bread", "Milk", "Milk"]
var counts = {};
listFoodnames.forEach(x => {
counts[x] = (counts[x] || 0) + 1;
});
console.log(counts) //LOGS EACH ITEM AS PROPERTY AND OCCURRENCES AS VALUE
const sortedCount =
Object.entries(counts).sort((a,b) => b[1] - a[1]).
reduce((a,v) => (a[v[0]] = v[1], a), {});
console.log(sortedCount);
&#13;