簡體   English   中英

通過數組中的屬性查找對象

[英]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不為nullundefined ,它將返回當前objkey ,該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,則以上內容將拋出錯誤錯誤,因為您無法分配給它。 為了解決這個問題,您可以將其抽象為一個遞歸處理函數的函數:

http://jsfiddle.net/h4jVg/

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM