我有一个像下面的对象
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]
}
});
答案 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);