您可以通过sID 使用keyBy() 缓存marks.lab 数组作为参考。使用map 返回一个新的学生数组,其中使用pick 从marks.lab 缓存中获取您想要的密钥,然后使用assign() 添加所有学生属性。这样做可以确保students 数组不会发生突变。
var labs = _.keyBy(marks.lab, 'sID'); // cache by key
var result = _.map(students, function(student) {
return _(labs[student.sID]) // get the cache
.pick(['coding']) // This returns a new object
.assign(student); // Assigns the student object
});
var students = [
{ sID: '1', name: 'Ryan' },
{ sID: '2', name: 'Rez James' },
{ sID: '3', name: 'Hazel Charmagne' }
];
var marks = {
lab: [
{ sID: '1', coding: 'A' },
{ sID: '2', coding: 'A' },
{ sID: '3', coding: 'A' }
]
};
var labs = _.keyBy(marks.lab, 'sID'); // cache by key
var result = _.map(students, function(student) {
return _(labs[student.sID]) // get the cache
.pick(['coding']) // This returns an immutable object
.assign(student); // Assigns the student object
});
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>
更新
对于 lodash 3 解决方案,您可以简单地将 lodash 4 的 keyBy() 更改为 lodash 3 的 indexBy()。
var labs = _.indexBy(marks.lab, 'sID'); // cache by key
var result = _.map(students, function(student) {
return _(labs[student.sID]) // get the cache
.pick(['coding']) // This returns an immutable object
.assign(student); // Assigns the student object
});
var students = [
{ sID: '1', name: 'Ryan' },
{ sID: '2', name: 'Rez James' },
{ sID: '3', name: 'Hazel Charmagne' }
];
var marks = {
lab: [
{ sID: '1', coding: 'A' },
{ sID: '2', coding: 'A' },
{ sID: '3', coding: 'A' }
]
};
var labs = _.indexBy(marks.lab, 'sID'); // cache by key
var result = _.map(students, function(student) {
return _(labs[student.sID]) // get the cache
.pick(['coding']) // This returns an immutable object
.assign(student); // Assigns the student object
});
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdn.jsdelivr.net/lodash/3.10.1/lodash.js"></script>
使用lodash的优势是它提供了许多已经预先编写好的实用方法,节省了资源和开发者创建函数的时间。至于您的for 循环解决方案的情况,您可能会说,在更简单的情况下,一个简单的for 循环比使用lodash 实用程序方法更好且易读。
如果我们谈论性能,您可能会说解决方案方面,您的 for 循环可能会受到性能影响,因为它是 O(N^2)。您可以创建一个for 循环版本来缓存marks.lab 数组,然后再次循环students 数组以获得正确的输出:
var labs = {};
var i;
for(i = 0; i < marks.lab.length; i++) {
labs[marks.lab[i].sID] = marks.lab.coding;
}
for(i = 0; i < students.length; i++) {
students[i].coding = labs[students[i].sID];
}
上面的解决方案对于两个循环都有 O(N) 的时间。除了您的for 循环解决方案和上面的这个for 循环解决方案改变原始students 数组的部分之外,这更接近我上面提供的解决方案。当你想重用它时,改变原始数组可能是一件坏事。让我们调整上面的for 循环解决方案,以防止改变原始数组:
var labs = {};
var result = [];
var i;
for(i = 0; i < marks.lab.length; i++) {
labs[marks.lab[i].sID] = marks.lab.coding;
}
for(i = 0; i < students.length; i++) {
result.push(Object.assign(
{ coding: labs[students[i].sID] },
students[i]
));
}
如果您将上面的 for 循环解决方案与我提供的 lodash 解决方案进行比较,那么它肯定会为您节省几行代码和编写它的编码时间。