2015-09-05 32 views
0

我有一個數組,不斷更改與用戶輸入。函數來改變javascript數組的給定尺寸

例如:

user = ['a','b',['c','d'],'e',['f','g',['h','i'],'j']] 

我也有一個指針指向哪裏做出改變。

pointer = [1] change value at user[1] 
pointer = [2,1] change value at user[2][1] 
pointer = [4,2,2] change value at user[4][2][2] 

尺寸大多是不一樣的,可以超過10 現在我正在做一個字符串,然後EVAL。 我可以在不使用eval的情況下編寫函數嗎?

+2

你的功能是什麼樣的? – elclanrs

回答

2

使用lodash's _.set

_.set(user, [4,2,1], '!') 

或者,如果你不想要lodash,你可以自己實現這個。

function setDeep(obj, path, val) { 
    if (path.length === 1) 
     obj[path[0]] = val; 
    else 
     setDeep(obj[path.shift()], path, val) 
} 
// then use: setDeep(user, [4,2,1], 'something'). 

請注意,如果指定的鍵不存在,該版本將拋出。這也不是清晰度和可維護性的好例子,因此您需要改進它,但這是一個很好的起點 - 它可以滿足您的要求。

如果你需要而不是設置 - 使用lodash的_.get或自己實現它,它會非常類似於我的setDeep

+0

這真的有幫助。兩種方式都適合我! 非常感謝! – user262382

0

我假設用戶的輸入是一個字符串,而不是你的例子中的數組,因爲你提到了eval,否則它是一種完全不同的方法。

var user = "['a','b',[4,'d'],'e',['f','g',['h','i'],'j']]"; 
JSON.parse(user.replace(/'/g, "\"")); 
+0

謝謝。它適用於字符串。用戶是一個數組來存儲用戶輸入,我允許嵌套輸入。對不起,我的問題不清楚。 – user262382

+0

請點擊左側頂部的箭頭來回答我的問題。 – Sagi