2016-12-01 6 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'] 
    } 
]; 

Есть ли какой-то инструмент, где я могу сказать, «Transform мой входной массив в массив уникальных объектов домашних животных, где каждый выходной объект имеет свойство, значение которого представляет собой массив владельцев? "

Или мне нужно написать это вручную?

ответ

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