2017-09-26 73 views
0

我有下面列表中的對象由另一個陣列延伸數組對象:如何使用Underscore.JS

對象1:

[{ 
    empId: 1, 
    name: AAA, 
    schoolId: 1 
}, { 
    empId: 2, 
    name: BBB, 
    schoolId: 2 
}] 

和對象2:

[{ 
    schoolId: 1, 
    schoolName: SchoolA 
}, { 
    schoolId: 2, 
    schoolName: SchoolB 
}] 

在Object1和Object2這兩個對象中,SchoolId是通用字段。它可以作爲映射字段訪問。

現在我使用的UnderscoreJS我要實現以下目標_.extend方法:

輸出:

[{ 
    empId: 1, 
    name: AAA, 
    schoolId: 1, 
    school: SchoolA 
}, { 
    empId: 2, 
    name: BBB, 
    schoolId: 2, 
    school: SchoolB 
}] 

能否請你建議我怎麼能做到這一點?感謝

回答

0

使用_.indexBy(),然後_.map()所述第二陣列創建由第一陣列的schoolId索引(arr1Index),和創建一個擴展當前對象的新對象時,與具有相同schoolId一個對象從arr1Index

var arr1 = [{"empId":1,"name":"AAA","schoolId":1},{"empId":2,"name":"BBB","schoolId":2}]; 
 

 
var arr2 = [{"schoolId":1,"schoolName":"SchoolA"},{"schoolId":2,"schoolName":"SchoolB"}]; 
 

 
var arr1Index = _.indexBy(arr1, 'schoolId'); 
 

 
var result = _.map(arr2, function(o) { 
 
    return _.extend({}, o, arr1Index[o.schoolId]); 
 
}); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

0

您可以結合eachfindWhere如下。

var d1 = [{ 
 
    empId: 1, 
 
    name: "AAA", 
 
    schoolId: 1 
 
}, { 
 
    empId: 2, 
 
    name: "BBB", 
 
    schoolId: 2 
 
}]; 
 

 
var d2 = [{ 
 
    schoolId: 1, 
 
    schoolName: "SchoolA" 
 
}, { 
 
    schoolId: 2, 
 
    schoolName: "SchoolB" 
 
}]; 
 

 
var output = _.each(d1, function(obj) { 
 
    obj.school = _.findWhere(d2, { 
 
    schoolId: obj.schoolId 
 
    }).schoolName; 
 
}); 
 

 
console.log(output);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

0

可以這樣來做(注:該解決方案預計,我們有兩個陣列具有相同的長度,並且所述第一陣列的第N個元素應該與N進行擴展第二陣列等個元素):

var arrayOne = [{ 
 
    empId: 1, 
 
    name: 'AAA', 
 
    schoolId: 1 
 
}, { 
 
    empId: 2, 
 
    name: 'BBB', 
 
    schoolId: 2 
 
}]; 
 

 
var arrayTwo = [{ 
 
    schoolId: 1, 
 
    schoolName: 'SchoolA' 
 
}, { 
 
    schoolId: 2, 
 
    schoolName: 'SchoolB' 
 
}]; 
 

 
var result = _.map(arrayOne, function(value, index) { 
 
\t return _.extend({}, value, arrayTwo[index]) 
 
}) 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

和一個另外的話 - 有Lodash,這個問題解決了更簡潔:

_.zipWith(arrayOne, arrayTwo, _.assign) // ==> returns what you need 

Example with Lodash

0

您可以使用_extend_find

var arr1 = [{"empId":1,"name":"AAA","schoolId":1},{"empId":2,"name":"BBB","schoolId":2}]; 
 

 
var arr2 = [{"schoolId":1,"schoolName":"SchoolA"},{"schoolId":2,"schoolName":"SchoolB"}]; 
 

 

 
var output = _.each(arr1, function(a1) { 
 
    _.extend(a1, _.find(arr2, function(a2) { 
 
     return a2.schoolId == a1.schoolId; 
 
    })) 
 
}); 
 

 
console.log(output)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>