Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中组合多个词典?_Javascript_List_Dictionary - Fatal编程技术网

如何在Javascript中组合多个词典?

如何在Javascript中组合多个词典?,javascript,list,dictionary,Javascript,List,Dictionary,是否有比多个循环更容易产生如下结果的方法: var dictA = { male: 10, female: 20, unassigned: 30 }; var dictB = { male: 11, female: 21, unassigned: 31 }; var dictC = { male: 12, female: 22, unassigned: 32 }; 我不确定“combine”是否是正确的词。这仍然需要几个循环,但也许将reduce和for…in组合起来可以很好地完成这一点:

是否有比多个循环更容易产生如下结果的方法:

var dictA = { male: 10, female: 20, unassigned: 30 };
var dictB = { male: 11, female: 21, unassigned: 31 };
var dictC = { male: 12, female: 22, unassigned: 32 };

我不确定“combine”是否是正确的词。

这仍然需要几个循环,但也许将
reduce
for…in
组合起来可以很好地完成这一点:

var dictA={男:10,女:20,未分配:30};
变量dictB={男性:11,女性:21,未分配:31};
变量dictC={男性:12,女性:22,未分配:32};
常数res=[dictA,dictB,dictC].reduce((acc,el)=>{
用于(让输入el){
acc[键]=[…acc[键]| |[],el[键];
};
返回acc;
}, {})

控制台日志(res)假设
dictA
具有所有必要的属性,则此操作有效。它的功能不像@Nicks

const dictA={男:10,女:20,未分配:30};
const dictB={男:11,女:21,未分配:31};
常量dictC={男:12,女:22,未分配:32};
常量obj={};
Object.keys(dictA.forEach)(key=>{
obj[key]=[dictA,dictB,dictC].map(dict=>dict[key]);
});
控制台日志(obj)
const addToBucket=(bucket[k,v],prev=bucket[k]| |[])=>({
…桶[k]:[…上一页,v]
})  
const bucket=list=>list.flatMap(Object.entries).reduce(
(bucket,entry)=>addToBucket(bucket,entry),{}
)
// ---------------------------------------------------------- //
控制台日志(桶)([
{男:10,女:20,未分配:30},
{男:11,女:21,未分配:31},
{男:12,女:22,未分配:32},

]))
您也可以使用
.reduce()
.forEach()
来完成

var dictA = { male: 10, female: 20, unassigned: 30 };
var dictB = { male: 11, female: 21, unassigned: 31 };
var dictC = { male: 12, female: 22, unassigned: 32 };

var input = [dictA, dictB, dictC];
var output = [];
input.forEach(function(item) {
  var existing = output.filter(function(v, i) {
    return v.name == item.name;
  });
  if (existing.length) {
    var existingIndex = output.indexOf(existing[0]);
    // output[existingIndex].value = output[existingIndex].value.concat(item.value);
  } else {
    if (typeof item.value == 'string')
      item.value = [item.value];
    output.push(item);
  }
});

alert(output[0].male);

我很乐意向您解释任何让您感到困惑的事情@JBisWell它是有效的,而且是精益的。如果有一个更具“可读性”的答案,我肯定会接受它——因为在一天结束时,我宁愿这样做,而不是多个循环(老实说,这更具可读性)。尽管我对正在发生的一些事情并不熟悉,但我相信我可以通过进一步挖掘来发现。这是一个快速的回复,谢谢@Nick@StevenFloyd没问题!从技术上讲,这是两个循环(
reduce
是一个循环,
for…in
是一个循环)。也就是说,很多其他的解决方案都有三个循环,这显然是多余的,在JS中,我们通常称这些对象,而不是字典或列表:)另请参见:这是否回答了您的问题?
var dictA = { male: 10, female: 20, unassigned: 30 };
var dictB = { male: 11, female: 21, unassigned: 31 };
var dictC = { male: 12, female: 22, unassigned: 32 };

var input = [dictA, dictB, dictC];
var output = [];
input.forEach(function(item) {
  var existing = output.filter(function(v, i) {
    return v.name == item.name;
  });
  if (existing.length) {
    var existingIndex = output.indexOf(existing[0]);
    // output[existingIndex].value = output[existingIndex].value.concat(item.value);
  } else {
    if (typeof item.value == 'string')
      item.value = [item.value];
    output.push(item);
  }
});

alert(output[0].male);
let result = [dictA, dictB, dictC].reduce((rv, dict) => (
    Object.keys(dict).forEach(key => (
        rv[key] != null ? rv[key].push(dict[key]) : rv[key] = [dict[key]]
    )),
    rv
), {});