JavaScript - 重组对象列表的工具?

时间:2016-12-01 06:17:55

标签: javascript arrays object transformation

这是一个数据结构类型的问题,所以我认为这将是一个很好的论坛。 我开始在下面遇到这个问题。 有些服务会以下面的格式向我发送数据。 它是一群人,告诉我他们拥有什么宠物。

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']
  }
];

是否有一些我可以说的工具,"将我的输入数组转换为一个独特的宠物对象数组,其中每个输出对象都有一个属性,其值是一个所有者数组?"

或者我需要手写这个吗?

2 个答案:

答案 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.reducehash 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;}