【问题标题】:How to sort an object by its values with multiple keys?如何使用多个键按对象的值对对象进行排序?
【发布时间】:2019-04-04 15:51:42
【问题描述】:

I want to use the sort method explained here 但我有

{
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
}

我创建了这个函数,我将每个字符串组合在一起并添加一个计数(作为键的值,见上文)

function generateCountDuplication(wordArray) {
  const countedWords = wordArray.reduce(function(allWords, word) {
    if (word in allWords) {
      allWords[word]++;
    }
    else {
      allWords[word] = 1;
    }
    return allWords;
  }, {});
  return countedWords;
}

我尝试用谷歌搜索并在 Stackoverflow 上查看此处,但没有找到任何按值排序的位置当键不唯一时。有什么解决办法吗?

我想要这个结果:

{
  "TUBE": 1,
  "DCS": 2,
  "BREAKOUT": 6,
  "RAISING": 8,
  "REAR": 61,
  "TOWER": 65,
  "JACKS": 84,
  "FEED": 114,
  "INSTALLATION": 119,
  "ASSEMBLY": 326,
  "JACK": 334,
  "HYDRAULIC": 1421,
  "CYLINDER": 2986
}

【问题讨论】:

  • 不要认为你可以在 javascript 中对对象进行排序
  • 你到底是什么意思?你有一个这样的对象数组吗?
  • 请展示您预期输出的示例
  • 很抱歉没有从一开始就描述我想要的最终结果。
  • 仅供参考:并非所有浏览器/js 引擎都保证对象顺序。所以最好使用数组和映射值。

标签: javascript arrays sorting object


【解决方案1】:

按如下方式取消Object.keys()map 即可达到预期效果。

const list = {
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
};

var newList = {};
Object.keys(list).sort(function(a,b){return list[a]-list[b]})
                 .map(key => newList[key] = list[key]);
console.log(newList);

【讨论】:

  • 我们终于明白了,这就是OP的意思。我也会做这样的事情。纯粹主义者会说你不能依赖键值对象中的顺序
  • OP 更新了他的问题。我能够得到他预期的结果。我不确定你的问题是什么。
  • 没问题。我投了赞成票并鼓掌。但正如我所说,some people here will argue that one cannot rely on the order in a hash table
  • 也许地图有点误导,因为您使用了副作用。 forEach is more appropriate 在我看来,但你仍然是第一个猜测/解决 OP 想要什么的人
【解决方案2】:

Object.entries 和 forEach,因为 map 不是复制键值最相关的方法

正如epascarello 提到的,你最好使用一个实际的数组,因为你不应该依赖对象中的键顺序

const list = {
  "CYLINDER": 2986,
  "HYDRAULIC": 1421,
  "JACKS": 84,
  "INSTALLATION": 119,
  "REAR": 61,
  "JACK": 334,
  "TUBE": 1,
  "FEED": 114,
  "ASSEMBLY": 326,
  "DCS": 2,
  "TOWER": 65,
  "RAISING": 8,
  "BREAKOUT": 6,
},newList = {}

Object.entries(list).sort((a,b) => a[1]-b[1])
  .forEach(elm => newList[elm[0]] = elm[1])

console.log(newList);

【讨论】:

    【解决方案3】:

    您需要做的第一件事是将对象属性转换为数组,格式为

    [
       {word: "CYLINDER", count: 2986},
       {word: "HYDRAULIC", count: 4421}
       // etc
    ]
    

    然后就可以使用排序了。

    var input = {
      "CYLINDER": 2986,
      "HYDRAULIC": 1421,
      "JACKS": 84,
      "INSTALLATION": 119,
      "REAR": 61,
      "JACK": 334,
      "TUBE": 1,
      "FEED": 114,
      "ASSEMBLY": 326,
      "DCS": 2,
      "TOWER": 65,
      "RAISING": 8,
      "BREAKOUT": 6,
    };
    
    var result = Object.keys(input)
                       .map( x => ({word:x, count:input[x]}))
                       .sort( (a,b) => a.count - b.count);
    console.log(result);

    【讨论】:

    • 如果您要更改结构,那么您也可以使用Object.entries() 并剥离.map() 调用:Object.entries(input).sort((a, b) => a[1] - b[1])
    • @Andreas 但是你丢失了结果所需的密钥......除非我错过了什么。
    • Object.entries() 返回:[ [key, value], [key, value], ... ]
    【解决方案4】:

    正如您链接的文档中所述,sort 函数接受一个参数,即 compareFunction。因此,如果您想通过 INSTALLATION 键对对象数组进行排序,您可以简单地执行以下操作:

    array.sort(function(a,b) {return a.INSTALLATION - b.INSTALLATION})
    

    【讨论】:

    • 价值观。我打赌他的意思是从 1 到 2986 排序
    【解决方案5】:

    结合Object.keys(obj).sort().map

    const obj = {
      "CYLINDER": 2986,
      "HYDRAULIC": 1421,
      "JACKS": 84,
      "INSTALLATION": 119,
      "REAR": 61,
      "JACK": 334,
      "TUBE": 1,
      "FEED": 114,
      "ASSEMBLY": 326,
      "DCS": 2,
      "TOWER": 65,
      "RAISING": 8,
      "BREAKOUT": 6,
    }
    
    var sorted = {};
    
    console.log("Un-sorted", obj);
    
    Object.keys(obj).sort().map(function(key){
      sorted[key] = obj[key];
    });
    
    console.log("Sorted", sorted)

    我确信有一个更优雅的解决方案,但这也有效。

    【讨论】:

    • 按键名排序,而不是值
    猜你喜欢
    • 2010-11-11
    • 2023-02-03
    • 2023-02-05
    • 2012-12-10
    • 2021-04-03
    • 2011-12-23
    • 1970-01-01
    • 2021-09-23
    • 2021-07-20
    相关资源
    最近更新 更多