2017-02-15 51 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