JavaScript - 使用。将源对象的属性扩展到目标对象

时间:2017-02-15 17:35:48

标签: javascript

我正致力于构建一个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;
}

2 个答案:

答案 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;
&#13;
&#13;

评论中讨论的备用循环方法:

&#13;
&#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;
&#13;
&#13;