【问题标题】:sorting by value in maps in javascript在javascript中按值排序
【发布时间】:2016-09-09 16:21:56
【问题描述】:

我有一个具有多对一映射的对象:

{
  'a' : 'one',
  'b' : 'two',
  'c' : 'one',
  'd' : 'two'
}

现在我想从中制作以下对象:

{
  'one' : ['a' , 'c'],
  'two' : ['b' , 'd']
}

在 javascript 中最有效的方法是什么(如果有帮助,我们也可以使用下划线库) 注意:上述对象只是实际问题的较短版本。

【问题讨论】:

  • 你写了什么代码来解决这个问题?
  • 自己有什么尝试吗?
  • 我们可以尝试帮助您,但您必须先尝试。向我们展示您的第一种方法,然后您会收到一些建议,我敢肯定。
  • 算法:遍历对象-创建一个空数组-如果遇到key-val对的新值,则将值存储在数组中-将对应的键存储为值-如果有值已经存在,将对应的键推送到值列表中

标签: javascript arrays sorting dictionary underscore.js


【解决方案1】:
var data = {
  'a' : 'one',
  'b' : 'two',
  'c' : 'one',
  'd' : 'two'
}

var result = {};

for(var key in data) {
    var val = data[key];
    if(!result[val]) result[val] = [];

    result[val].push(key);
}

console.log(result);

【讨论】:

    【解决方案2】:

    您可以使用 Object.keys()reduce 来做到这一点

    var data = {'a': 'one','b': 'two','c': 'one','d': 'two'}
    
    var result = Object.keys(data).reduce((res, e) => {
      res[data[e]] = (res[data[e]] || []).concat(e);
      return res;
    }, {});
    
    console.log(result)

    您也可以使用forEach 并添加到创建的对象

    var data = {'a': 'one','b': 'two','c': 'one','d': 'two'}, r = {}
    
    Object.keys(data).forEach(e => {r[data[e]] = (r[data[e]] || []).concat(e)});
    console.log(r)

    【讨论】:

      【解决方案3】:

      嗯,这是我的方法。不过不如 Nenad 先进。

      var obj = {
        'a' : 'one',
        'b' : 'two',
        'c' : 'one',
        'd' : 'two'
      };
      
      var result = {};
      
      for (var i in obj) {
        if (obj[i] in result) {
          result[obj[i]].push(i);
        } else {
          result[obj[i]] = [i];
        }
      }
      
      console.log(result);
      

      【讨论】:

      • 这正是我之前的想法
      【解决方案4】:

      单排

      var map = {
        'a' : 'one',
        'b' : 'two',
        'c' : 'one',
        'd' : 'two'
      },
      
      reduced = Object.keys(map).reduce((p,c) => {!!p[map[c]] ? p[map[c]].push(c) : p[map[c]] = [c]; return p},{})
      
      document.write("<pre>" + JSON.stringify(reduced) + "</pre>");

      【讨论】:

        猜你喜欢
        • 2018-03-09
        • 2014-10-19
        • 1970-01-01
        • 2021-03-21
        • 2017-07-14
        • 2013-03-14
        • 1970-01-01
        • 2016-10-25
        • 2020-09-13
        相关资源
        最近更新 更多