2017-08-17 13 views
6

Hãy nói rằng bạn đã có ba mảng của các đối tượng:lĩnh vực hiệu quả việc sáp nhập từ một mảng thành hai mảng khác

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

Mục đích là để sử dụng a1 như một nguồn, và thêm một lĩnh vực id đến các yếu tố của a2a3 với các trường name tương ứng trong a1. Một cách hiệu quả để đạt được điều này là gì? (Lưu ý: 'hiệu quả' ở đây có nghĩa là 'một cái gì đó tao nhã hơn vòng-trong-vòng-trong-vòng'.)

Kết quả sẽ giống như thế này:

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

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

Bạn đã thử gì vậy, đến nay? – Li357

Trả lời

2

Bạn có thể sử dụng số Map để tham chiếu id của tên đã cho. Sau đó gán.

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

Đây là tất cả các câu trả lời hay, nhưng tôi thích sự sạch sẽ khi sử dụng Bản đồ. Các chương trình tổng thể này đã đưa ra là phức tạp hơn (Node + MongoDB + hệ thống tập tin đọc/ghi), do đó, mỗi bit sẽ giúp! :) –

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

đầu tiên tôi muốn đưa các chỉ số trong những cái tên được đưa ra, sau đó chỉ cần lập bản đồ các mảng được sáp nhập vào:

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

Đề xuất vòng lặp đơn - cre ăn một hash table và sau đó merge lĩnh vực vào mảng - giới thiệu dưới đây:

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

Đối với một câu trả lời khác, nó có thể là như thế này.

Nó không bao gồm vòng lặp và có thể là mã ngắn nhất trong câu trả lời.

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

Các vấn đề liên quan