[英]Find object by properties from array
有一個數組,一個值和一個帶有嵌套對象的對象:
賓語
mesh
數組
['options', 'range', 'x']
值
12.5
是否可以翻譯此屬性以更新屬性,例如
mesh.options.range.x = 12.5
嘗試:
index = (obj, i) ->
obj[i]
arr.reduce(index, obj) = 12.5
更新資料
謝謝大家的優雅解決方案。
實際上,使用.reduce()
很不錯:
// current object----| |----current key
// v v
arr.reduce(function(obj, key) {
return obj == null ? obj : obj[key];
}, window.mesh);
// ^
// |-- initial object
您嘗試使用.reduce()
需要傳遞一個用於管理“累加”的函數。
在這里,只要前一個obj
不為null
或undefined
,它將返回當前obj
的key
,該key
成為下一個obj
。
然后,由於您需要分配一個值,因此您實際上要獲取倒數第二個鍵的值。
var o = arr.slice(0,-1).reduce(function(obj, key) {
return obj == null ? obj : obj[key];
}, window.mesh);
然后檢查其存在並使用arr
的最后一項進行分配。
o && o[arr.pop()] = 12.5;
所有這些都可以抽象為一個函數,該函數根據傳遞的參數數量來執行一個或另一個函數。
function setFromArray(obj, arr, val) {
var keys = arguments.length < 3 ? arr.slice() : arr.slice(0, -1);
var o = keys.slice(0,-1).reduce(function(obj, key) {
return obj == null ? obj : obj[key];
}, window.mesh);
if (arguments.length < 3)
return o;
else
o && o[keys.pop()];
}
這是一個常規解決方案:
function setPropertyPath(obj, path, value) {
var o = obj;
for (var i = 0; i < path.length - 1; i++) {
o = o[path[i]];
}
o[path[path.length - 1]] = value;
}
用法:
var obj = { a: { b: { c: 0 } } };
setPropertyPath(obj, ['a', 'b', 'c'], 10);
console.log(obj.a.b.c); // prints '10'
var mesh = {},
arr = ['options','range','x'],
value = 12.5;
mesh[arr[0]][arr[1]][arr[2]] = value;
如果數組長度是靜態的,請執行以下操作:
mesh[array[0]][array[1]][array[2]] = value;
但是,與此相關的一個問題是javascript無法自動進行生存,因此,如果您訪問的是先前未定義的鍵值,則可能會遇到錯誤(如果未定義mesh.options,則以上內容將拋出錯誤錯誤,因為您無法分配給它。 為了解決這個問題,您可以將其抽象為一個遞歸處理函數的函數:
function update_val(obj, array, val, prev) {
if (array.length == 0) {
obj = val;
return;
}
var cur = array.shift();
if(array.length == 0) {
obj[cur] = val;
return;
} else if (obj[cur] == undefined) {
obj[cur] = {};
}
update_val(obj[cur], array, val);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.