2016-12-01 40 views
3

這是一個數據結構類型的問題,所以我認爲這將是一個很好的論壇來問問它。 我開始遇到以下相當多的問題。 某些服務以下列格式向我發送數據。 這是一羣人,告訴我他們擁有什麼寵物。JavaScript - 重構對象列表的工具?

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

有一些工具,我可以說,「改變我輸入數組一個獨特的寵物對象數組,其中每個輸出對象都有一個屬性,其值是一組所有者?「

還是我需要手工寫這個嗎?

回答

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

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