2017-02-15 42 views
1

我正在构建一个JavaScript函数,它将源对象的可枚举属性分配给目标对象。但是,后续来源会覆盖以前来源的属性分配。JavaScript - 将源对象的属性扩展为目标对象使用

例子,如果称为例如:

extend({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' }); 

应该返回 - >{ 'user': 'fred', 'age': 40 }

奖金:使用减少

这是一个编程训练营,我的运动/挑战为了找到解决办法,我一直在研究无尽的。我的问题在于测试对象不包含在数组中,所以我不能使用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

顺便说一下,你的代码工作... –

+0

呃,'常量extend = Object.assign;'? – Bergi

回答

1
function extend(...objs){ 
return objs.reduce((newobj,obj)=>Object.assign(newobj,obj),{}); 
} 

的...运算符返回的参数数组。所以你可以减少它,并使用对象分配来复制道具... http://jsbin.com/xamoremati/edit?console,有趣的是不重写...

+1

备注:扩展语法不适用于所有浏览器。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator – TheJim01

+0

@ TheJim01但是,由于这是一项编码挑战,当他进入生产环境时,它在大多数浏览器中都可用。 –

+0

同意。我只是给任何后来发现这个问题的人留下一张便条。如果这超出了评论范围,我会将其删除。 – TheJim01

0

把你的参数列表转换为数组,然后使用减少你通常会如何。如在评论中讨论

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 }

备用循环方式:

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

+0

谢谢!我能够用这种方法进行测试。 您的代码部分: var keys = Object.keys(val), key = null; (key中的var keyIdx){ key = keys [keyIdx]; acc [key] = val [key]; 你能用通俗的话来解释你是如何通过这个工作的?我更熟悉数组表示法,更少用对象表示法 – DarrickTM

+2

@DarrickTM Object.keys是不必要的。只需要在val中使用(var keyIdx)。对象键返回一个对象键的数组... –

+0

@Jonasw是正确的,在场景中是没有必要的(使用'for(in)'方法)。如果你打算在真正的计数器上使用'for'循环,把键放到一个数组中可能是有用的(或者你可以自己保留一个计数器)。 – TheJim01