javascript - 按值对对象的属性进行排序并保留值

标签 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>

最佳答案

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

另请注意,当您将数组中的项目组合成单个对象时,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);

关于javascript - 按值对对象的属性进行排序并保留值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50807365/

相关文章:

javascript - 是否可以使用 Javascript 触发鼠标中键单击事​​件?

javascript - 在 JavaScript 中将数字转换为基数 64 的最快方法?

javascript - 为什么我收到错误 'document.write can be a form of eval' ?

javascript - 自定义 jQuery 验证规则无法正常工作

javascript - HTML5 中所有元素都可以拖动吗,我希望 <Audio> 可以拖动,这可能吗?

javascript - 根据内容对齐jqGrid列

javascript - JQuery 自动完成返回带有标签和值的数据数组,但不将标签显示为建议

javascript - 增加滚动元素的顶部位置,直到达到高度(jQuery)

javascript - 下拉菜单在父级下方居中,溢出 : hidden

javascript - Internet Explorer 中的 HTMLDivElement 对象上未定义“append”