这是一个数据结构类型的问题,所以我认为这将是一个很好的论坛。 我开始在下面遇到这个问题。 有些服务会以下面的格式向我发送数据。 它是一群人,告诉我他们拥有什么宠物。
owners = [
{
owner: 'anne',
pets: ['ant', 'bat']
},
{
owner: 'bill',
pets: ['bat', 'cat']
},
{
owner: 'cody',
pets: ['cat', 'ant']
}
];
但我真正想要的是一系列宠物,人们拥有它们,就像这样:
pets = [
{
pet: 'ant',
owners: ['anne', 'cody']
},
{
pet: 'bat',
owners: ['anne', 'bill']
},
{
pet: 'cat',
owners: ['bill', 'cody']
}
];
是否有一些我可以说的工具,"将我的输入数组转换为一个独特的宠物对象数组,其中每个输出对象都有一个属性,其值是一个所有者数组?"
或者我需要手写这个吗?
答案 0 :(得分:1)
您可以在哈希表的帮助下构建一个新数组,并迭代所有所有者和所有宠物。
var owners = [{ owner: 'anne', pets: ['ant', 'bat'] }, { owner: 'bill', pets: ['bat', 'cat'] }, { owner: 'cody', pets: ['cat', 'ant'] }],
pets = [];
owners.forEach(function (owner) {
owner.pets.forEach(function (pet) {
if (!this[pet]) {
this[pet] = { pet: pet, owners: [] }
pets.push(this[pet]);
}
this[pet].owners.push(owner.owner);
}, this)
}, Object.create(null));
console.log(pets);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)
使用Array.prototype.reduce
和hash table
的解决方案 - 请参阅下面的演示:
var owners=[{owner:'anne',pets:['ant','bat']},{owner:'bill',pets:['bat','cat']},{owner:'cody',pets:['cat','ant']}];
var pets = owners.reduce(function(hash) {
return function(p,c){
c.pets.forEach(function(e){
hash[e] = hash[e] || [];
if(hash[e].length === 0)
p.push({pet:e,owners:hash[e]});
hash[e].push(c.owner);
});
return p;
}
}(Object.create(null)), []);
console.log(pets);
.as-console-wrapper{top:0;max-height:100%!important;}