我正致力于构建一个JavaScript函数,该函数将源对象的可枚举属性分配给目标对象。但是,后续来源会覆盖以前来源的属性分配。
如果这样调用的示例:
extend({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });
应该返回 - > { 'user': 'fred', 'age': 40 }
奖金:使用Reduce
这是对编程新手训练营的一个练习/挑战,我已经无休止地研究以找到解决方案。我的问题是测试对象不包含在数组中,所以我不能使用reduce来操作它们。我尝试了多种方法来改变测试对象,例如Array.prototype.slice.call(arguments)。
仍然在学习,所以如果有任何疏忽或考虑因素,请告诉我。我已经有一段时间了,所以我非常有信心会有一些简单的心理错误
我目前无法通过我提供的所有测试。
示例代码:
function extend(destination) {
var args = Array.prototype.slice.call(arguments);
var result = args.reduce(function (newObj, currentObj) {
for (var key in currentObj) {
if (currentObj.hasOwnProperty(key)) {
newObj[key] = currentObj[key];
}
}
return newObj;
}, {});
return result;
}
答案 0 :(得分:1)
function extend(...objs){
return objs.reduce((newobj,obj)=>Object.assign(newobj,obj),{});
}
...运算符返回一个参数数组。所以你可以减少它,并使用对象分配来复制道具... http://jsbin.com/xamoremati/edit?console,有趣的是,它不会覆盖......
答案 1 :(得分:0)
将您的参数列表转换为数组,然后使用reduce通常的方式。
function extend(){
var inputArray = [];
for(var i = 0, len = arguments.length; i < len; ++i) inputArray.push(arguments[i]);
return inputArray.reduce(function(acc, val){
var keys = Object.keys(val),
key = null;
for(var keyIdx = 0, len = keys.length; keyIdx < len; ++keyIdx){
key = keys[keyIdx];
acc[key] = val[key];
}
return acc;
});
}
var results = extend({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' }); // { user: "fred", age: 40 }
&#13;
评论中讨论的备用循环方法:
function extend(){
var inputArray = [];
for(var i = 0, len = arguments.length; i < len; ++i) inputArray.push(arguments[i]);
return inputArray.reduce(function(acc, val){
for(var key in val){
acc[key] = val[key];
}
return acc;
});
}
&#13;