在javascript中按映射中的值排序

sorting by value in maps in javascript

本文关键字:排序 javascript 映射      更新时间:2023-09-26

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

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

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

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

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

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);

您可以使用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)

好吧,这是我的方法。不过没有内纳德的先进。

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);

一个单层

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>");