按值排序对象的属性并保留值

时间:2018-06-11 23:27:39

标签: javascript

我创建了一系列具有重复数据的食物名称。使用:

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>

3 个答案:

答案 0 :(得分:4)

不幸的是,根据规范,不保证订购对象属性。您可以尝试使用对象数组。

另请注意,当您将数组中的项目合并为单个对象时,reduceforEach更合适。

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。

因此,使用这些知识,我们可以将结果制作出你的格式,一个已排序的对象。

以下示例。

&#13;
&#13;
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;
&#13;
&#13;