2013-04-28 98 views
0

我需要在javascript中获取/设置嵌套对象,我写了下面的setter,并且正在工作,我需要获取帮助: 可以说我有以下对象,我想要做一些事情像Javascript设置访问嵌套对象

var prop = get(object, ['complexObj', 'prop1']); 
set(object, ['complexObj', 'prop1'], 'newValue'); 
var object = { 
    complexObj: { 
     'prop1': 'A' 
     'prop2': 'B'}, 
    'prop3': 'C' 
}; 

// helper function 
var read = function(obj, prop) 
{ 
    if ((obj != null ? obj[prop] : void 0) == null) 
    { 
     return; 
    } 
    return obj[prop]; 
}; 
// The following methods allow contextManager data to be accessed either via array of property name parts like ['complexObj', 'subObj', 'subProp1'] 
var get = function (props) { 
    var current = properties; 
    var val; 
    for (var i = 0; i < props.length; i++) { 
     if (val = read(current, props[i])) { 
      current = val; 
     } else { 
      return ''; 
     } 
    } 
    return current; 
}; 

我徘徊,如果有一种方法可以做到这一点使用jQuery/lodash或另一个库,对象内部的,而不是循环? 另外我需要一点帮助。

+2

你能不能简单地缩进你的代码?如果您需要,请使用http://jsbeautifier.org。 – 2013-04-28 15:57:27

+0

请问您可以缩进吗?并更清楚地描述一下这个应该做什么? – Ryan 2013-04-28 15:57:31

+3

为什么你不能只做'object.complexObj.prop1 =“newvalue”'? – Bart 2013-04-28 16:00:37

回答

0

尝试

var object = { 
    complexObj: { 
     'prop1': 'A', 
     'prop2': 'B' 
    }, 
    'prop3': 'C' 
}; 

// helper function 
var read = function(obj, prop) { 
    return obj ? obj[prop] : undefined; 
}; 
// The following methods allow contextManager data to be accessed either via array of property name parts like ['complexObj', 'subObj', 'subProp1'] 
var get = function (properties, props) { 
    var current = properties; 
    var val; 
    for (var i = 0; i < props.length; i++) { 
     if (val = read(current, props[i])) { 
      current = val; 
     } else { 
      return undefined; 
     } 
    } 
    return current; 
}; 
console.log(get(object, ['complexObj', 'prop1'])); 
//set(object, ['complexObj', 'prop1'], 'newValue'); 
console.log(get(object, ['complexObj', 'prop1'])); 

演示:Fiddle

有像你这样的一些错误,我们叫get它被定义之前,你必须通过objectget方法的第一个参数

+0

你可能应该返回'undefined'而不是'''' – 2013-04-28 16:11:07

+0

@ gion_13是的可能 – 2013-04-28 16:12:20

0
// get a property 
var get = function(obj, accessor) { 
    for (var i = 0, len = accessor.length; i < len; i++) { 
     if (!obj) return ""; 
     obj = obj[accessor[i]]; 
    } 

    return obj; 
}; 

// set a property 
var set = function(obj, accessor, value) { 
    for (var i = 0, len = accessor.length - 1; i < len; i++) { 
     if (!obj) obj = {}; 
     obj = obj[accessor[i]] = obj[accessor[i]] || {}; 
    } 

    obj[accessor[i]] = value; 
}; 

// example 
var object = { 
    a: 2, 
    b: { 
     c: 1 
    } 
}; 

get(object, ["b", "c"]); // 1 
set(object, ["d"], 3); // { a: 2, b: { c: 1 }, d: 3 } 
set(object, ["e", "f"], 4); // { ..., e: { f: 4 } } 

/* 
object == { 
    a: 2, 
    b: { 
     c: 1 
    }, 
    d: 3, 
    e: { 
     f: 4 
    } 
} 
*/ 

此代码在设置不存在的属性时会自动创建新对象。