2011-02-01 152 views
4

有沒有更簡潔的寫法呢?JavaScript:功能映射?

var me = {}; 

for (var i in you) { 
me[i] = you[i]; 
} 

(其中you是任意-lengthed JavaScript數組)

換句話說,給定的輸入:

var you = [ 
"what", 
"r", 
"u" 
]; 

輸出,me,變爲:

me = { 
0: "what", 
1: "r", 
2: "u" 
}; 

像,使用一些功能方法的單線?

+2

實際上你的榜樣會給`我= {0: 「什麼」,1: 「R」,2: 「U」 ,長度:3/*和Array的原型* /};` – tobyodavies 2011-02-01 04:37:12

+0

因爲您要求[「功能性JavaScript」](http://osteele.com/sources/javascript/functional/)... :) – 2011-02-01 06:48:21

回答

3

你爲什麼要這麼做? JavaScript中的數組對象,但有一些附加屬性,如slice,splice,pushlength

在內部,數組和對象的存儲方式完全相同:例如, 是相同作爲array["0"]object["0"](不像其他語言中相鄰的數組索引實際上在相鄰的內存中 - 數組「索引」在JavaScript中簡單地轉換爲字符串)。

所以,如果你只是想複製的數據,那麼這個就足夠了:

me = you.slice(); // me is a copy of you, but is still an array 

或者,如果你真的想要某種映射功能,那麼underscore.js提供的函數式編程工具,整個集合你細讀。

1

沒有內置函數可以完成你所要求的功能,但是一些廣泛使用的JavaScript庫(如jQuery)提供了這樣的功能。在jQuery的情況下:jQuery.extend()

用法:

var me = {}; 
jQuery.extend(me,someObject); 

//or, equivalently - 
var me2 = jQuery.extend({},someObject); 
0

jQuery有一個extend()函數(documentation here)。您的代碼應該是這樣的:

var me = {}; 
var you = ["what", "r", "u"]; 
$.extend(me, you); 

這將允許你做這樣的事情:

alert("Second element: " + me[1]); 

這是一個有點古怪,但我認爲這是你在找什麼。

0

我看到你想用你的字符串格式化程序來實現。相反,回答你原來想出一個簡潔的方式完成它的一個部分的問題,我會建議一個簡潔的(更靈活)實現整個事情:

String.prototype.format = function() { 
    var args = arguments; 

    return this.replace(/\{(?:(\d+)|(\w+))\}/g, function (s, idx, prop) { 
     return prop && args[0] 
      ? args[0][prop] 
      : args[idx]; 
    }); 
}; 

當你有一些n內一個令牌"{n}",它使用第n個參數進行替換。否則,對於非數字鍵,它會選擇第一個參數的相應屬性。

例如:

"I have {1} {name}s in my basket.".replace({ type: "fruit", name: "eggplant" }, 4); 

返回:

"I have 4 eggplants in my basket." 
0

的underscore.js庫還具有基本延伸功能。

var me = _({}).extend(you)

var me = {} 
_(me).extend(you) 

var me = {} 
_.extend(me, you)