2017-08-17 51 views
6

比方說,你已經有了對象的三個數組:從一個陣列有效地融合領域到其他兩個數組

let a1 = [ 
    { id: 1, name: 'foo' }, 
    { id: 2, name: 'bar' }, 
    { id: 3, name: 'baz' } 
] 

let a2 = [ 
    { name: 'foo' }, 
    { name: 'bar' } 
] 

let a3 = [ 
    { name: 'bar' }, 
    { name: 'baz' } 
] 

的目標是使用a1作爲源和id字段添加到的元素a2a3a1中相應的name字段。什麼是實現這一目標的有效方式? (注:「有效的」在這裏的意思是「比什麼更優雅的環中之環中之環」。)

結果應該是這樣的:

a2: [ 
    { id: 1, name: 'foo' }, 
    { id: 2, name: 'bar' } 
] 

a3: [ 
    { id: 2, name: 'bar' }, 
    { id: 3, name: 'baz' } 
] 
+1

你嘗試過什麼到目前爲止? – Li357

回答

2

你可以使用Map來引用給定名稱的ID。然後分配。

var a1 = [{ id: 1, name: 'foo' }, { id: 2, name: 'bar' }, { id: 3, name: 'baz' }], 
 
    a2 = [{ name: 'foo' }, { name: 'bar' }], 
 
    a3 = [{ name: 'bar' }, { name: 'baz' }], 
 
    map = new Map(a1.map(o => [o.name, o.id])); 
 
    
 
[a2, a3].forEach(a => a.forEach(o => o.id = map.get(o.name))); 
 

 
console.log(a2); 
 
console.log(a3);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

這些都是很好的答案,但我喜歡使用Map的清潔。整個程序出現的更復雜(Node + MongoDB +文件系統讀/寫),所以每一點都有幫助! :) –

1
a2.forEach((a2Elem) => a2Elem.id = a1.filter((a1Elem) => a1Elem.name === a2Elem.name)[0].id) 
1

我先來給定名稱的指標,然後就映射陣列合併到:

function combine(mergeInto, base) { 
    let indexes = base.map(e => e.name); 
    return mergeInto.map(e => ({ 
     name: e.name, 
     id: base[indexes.indexOf(e.name)].id 
    })); 
} 

let a1 = [ 
 
    { id: 1, name: 'foo' }, 
 
    { id: 2, name: 'bar' }, 
 
    { id: 3, name: 'baz' } 
 
] 
 

 
let a2 = [ 
 
    { name: 'foo' }, 
 
    { name: 'bar' } 
 
] 
 

 
let a3 = [ 
 
    { name: 'bar' }, 
 
    { name: 'baz' } 
 
] 
 

 
function combine(mergeInto, base) { 
 
    let indexes = base.map(e => e.name); 
 
    return mergeInto.map(e => ({ 
 
     name: e.name, 
 
     id: base[indexes.indexOf(e.name)].id 
 
    })); 
 
} 
 

 
console.log(combine(a3, a1));

0

單循環建議 - 創建吃了hash table,然後合併領域進入陣列 - 以下演示:

let a1=[{id:1,name:'foo'},{id:2,name:'bar'},{id:3,name:'baz'}], a2=[{name:'foo'},{name:'bar'}], a3=[{name:'bar'},{name:'baz'}]; 
 

 
// create a hash table 
 
let hash = a1.reduce(function(p,c){ 
 
    p[c.name] = c; 
 
    return p; 
 
},Object.create(null)) 
 

 
// merge the results 
 
function merge(arr) { 
 
    Object.keys(arr).map(function(e){ 
 
    arr[e]['id'] = hash[arr[e].name]['id']; 
 
    }); 
 
    return arr; 
 
} 
 

 
console.log(merge(a2), merge(a3));
.as-console-wrapper{top:0;max-height:100%!important;}

2

對於備選答案,也可能是這樣。

它不包含循環,可能是答案中的最短代碼。

const a1 = [{ id: 1, name: 'foo' }, { id: 2, name: 'bar' }, { id: 3, name: 'baz' }]; 
 
const a2 = [{ name: 'foo' }, { name: 'bar' }]; 
 
const a3 = [{ name: 'bar' }, { name: 'baz' }]; 
 

 
let f = x => a1.filter(a => x.some(y => y.name === a.name)); 
 

 
console.log(f(a2)); 
 
console.log(f(a3));
.as-console-wrapper { max-height: 100% !important; top: 0; }