如何根据对象键的值对其进行分组?

时间:2017-04-28 15:35:02

标签: javascript jquery

我有一个像下面的对象

var score = { 'A': 1, 'B': 2, 'C': 1 };

我想创建另一个对象,其中键,值交换和相同值的键组合在一起,如下所示。

{ 1:['A', 'C'], 2: 'B' };

我不想在数组中使用单个值,如'B'。我想要他们一个人。 请帮忙。

嗨谢谢你的回答。最后,如果只有一个元素我删除了数组语法,我做了以下操作。

$.each(obj, function(key, arr){
    if(arr.length == 1){
    obj[key] = arr[0]
  }
});

4 个答案:

答案 0 :(得分:1)

你可以这样做:

var score = { 'A': 1, 'B': 2, 'C': 1 };

var obj = {};
for(var i in score) {
   if(!obj[score[i]]) {
   obj[score[i]] = [i];
   } else {
	obj[score[i]].push(i);
   }
}

console.log(obj);

修改

如果您不想要单个元素的数组,可以使用:

var score = { 'A': 1, 'B': 2, 'C': 1, 'D':1 };
    var obj = {};
    for (var i in score) {
        if (!obj[score[i]]) {
            obj[score[i]] = i;
        } else {
            var temp = obj[score[i]];
            if (Object.prototype.toString.call(temp) === "[object Array]") {
                obj[score[i]].push(i);
            } else {
                obj[score[i]] = [];
                obj[score[i]].push(temp);
                obj[score[i]].push(i);
            }
        }
    }
    
    console.log(obj);

答案 1 :(得分:1)

可能的解决方案,使用Array#forEach



var score = { 'A': 1, 'B': 2, 'C': 1 }, hash = {};
    Object.keys(score).forEach(v => (hash[score[v]] || (hash[score[v]] = [])).push(v));
    
    console.log(JSON.stringify(hash));




答案 2 :(得分:0)

var score = {
  'A': 1,
  'B': 2,
  'C': 1
};

var group = Object.keys(score).reduce(function(a, b) {
  var vKey = score[b];
  a[vKey] = a[vKey] || [];
  a[vKey].push(b);
  return a;
}, {});

console.log(group);

答案 3 :(得分:0)

以下解决方案使用了一些更新的Javascript语言功能:对象传播,数组传播,计算属性名称和数组concat方法。请注意,此方法不会为问题指定的单个值返回数组。

const s = { 'A': 1, 'B': 2, 'C': 1 };

const o = Object.keys(s).reduce((a, k) =>
  ({...a, ...{[s[k]]: a[s[k]] ? [...a[s[k]]].concat(k) : k}}), {});

console.log(o);

下面显示了相同的解决方案,只是为了更加可读性而略微充实。它还包含'D': 1中的附加值(score),如果您分开答案,则会显示数组传播的需求。注释显示变量值如何在循环的每次迭代中发生变化。

const score = { 'A': 1, 'B': 2, 'C': 1, 'D': 1 };

const invertedScore = Object.keys(score).reduce((acc, key) => {
                          // iter'n#:   0     1      2            3
                          // key:      'A'   'B'    'C'          'D'
  const val = score[key]; // val:       1     2      1            1
  const prev = acc[val];  // prev:    undef undef   'A'       ['A','C']
  const chgd = prev ? [...prev].concat(key) : key;
                          // chgd:     'A'   'B'   ['A','C']  ['A','C','D']
  return ({...acc, ...{[val]: chgd}});
}, {});

console.log(invertedScore);