2016-05-18 6 views
2

Функция полезности от this answer позволяет легко получить доступ к вложенным свойствам объектов и возвращает null (или undefined), если одно из родительских свойств не существует.Доступ к вложенным массивам/свойствам в javascript

оригинальный код:

get = function(obj, key) { 
    return key.split(".").reduce(function(o, x) { 
     return (typeof o == "undefined" || o === null) ? o : o[x]; 
    }, obj); 
} 
get(user, 'loc.lat')  // 50 
get(user, 'loc.foo.bar') // undefined 

Я действительно хочу, чтобы использовать это, но мне нужно, чтобы иметь возможность работать с вложенными массивами, а также.

Примеры:

var childArray = [0,1,2] 
var parentArray = [{myArray: childArray}] 
var obj = {key: parentArray} 

Я хочу продлить функцию полезности, как это:

get(obj, 'key[0].myArray[2]');  // 2 
get(obj, 'key[0].foo[2]');   // null 
get(obj, 'key[0].myArray[42]');  // null 

А в идеале он должен также быть в состоянии оценить это, а

var childArray = [0,1,2] 
var parentArray = [childArray, childArray] 
var obj = {key: parentArray} 

get(obj, 'key[1][0]');  // 0 
get(obj, 'foo[1][0]');  // null 

Вопрос:

Возможно ли получить доступ к массиву arr с заданной строковой ссылкой, например "arr[0]" (без регулярного выражения, чтобы удалить скобки ...)?

Знаете ли вы более элегантное решение, которое достигает результата, представленного в примерах выше?

+1

Просто измените "путь": 'получить (объект, 'key.0.myArray.2')' ([скрипку] (https://jsfiddle.net/1twrxeor/)) – Andreas

+0

Пожалуйста, сделайте это ответом, я поддержу и, возможно, приму это как решение. –

ответ

1

Проще всего было бы изменить путь/ключ вы передаете в get()

От

get(obj, 'key[0].myArray[2]'); 

Для

get(obj, 'key.0.myArray.2'); 

var get = function(obj, key) { 
 
    return key.split(".").reduce(function(o, x) { 
 
     return (typeof o == "undefined" || o === null) ? o : o[x]; 
 
    }, obj); 
 
} 
 

 
var childArray = [0,1,2] 
 
var parentArray = [{myArray: childArray}] 
 
var obj = {key: parentArray} 
 

 
console.log(get(obj, 'key.0.myArray.2'));  // 2 
 
console.log(get(obj, 'key.0.foo.2'));   // null 
 
console.log(get(obj, 'key.0.myArray.42'));  // null 
 

 
var childArray2 = [0,1,2] 
 
var parentArray2 = [childArray2, childArray2] 
 
var obj2 = {key: parentArray2} 
 

 
console.log(get(obj2, 'key.1.0'));  // 0 
 
console.log(get(obj2, 'foo.1.0'));  // null

0

Вместо этого я бы использовал массив имен свойств, что позволило бы вам легко рекурсии.

Но если вы хотите вернуться к исходному шаблону, вы все равно можете преобразовать свое выражение в этот массив.

Посмотрите на этот пример:

var innerget = function(object, proparr) { 
 
    if(proparr.length == 0) 
 
    return object; 
 
    
 
    if(typeof object == "undefined" || object === null) 
 
    return object; 
 
    return innerget(object[proparr.splice(0, 1)], proparr); 
 
}; 
 

 
var get = function(object, expr) { 
 
    var proparr = expr.replace(/\[/g, ".").replace(/\]/g, "").split("."); 
 
    return innerget(object, proparr); 
 
} 
 

 
var object = { 
 
    key: [[1, 2, 3], [4, 5, 6]] 
 
}; 
 

 
document.write(innerget(object, ['key', 'key2', 2]) + "<br>"); 
 
document.write(innerget(object, ['key', 0, 2]) + "<br>"); 
 
document.write(get(object, "key[0][1]"));

1

с изобретением Object.prototype.getNestedValue() вы можете динамически получить доступ к глубоко вложенные значения через свойства объектов и индексов массива. Все, что вам нужно сделать, - обеспечить динамические вложенные свойства и индексы в качестве аргументов в правильном порядке.

Object.prototype.getNestedValue = function(...a) { 
 
    return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]]; 
 
}; 
 

 
var arr = [{fox: [{turn:[857, 432]}]}, {sax: [{pana:[777, 987]}]}, {ton: [{joni:[123, 567]}]}, {piu: [{burn:[666, 37]}]}, {sia: [{foxy:[404, 696]}]}], 
 
    myObj = { foo : 1, bar: { baz : 2 }, bee : 3 }, 
 
    arg1 = 3, 
 
    arg2 = "piu", 
 
    arg3 = 0, 
 
    arg4 = "burn", 
 
    arg5 = 1; 
 

 
document.write(arr.getNestedValue(arg1,arg2,arg3,arg4,arg5));

Смежные вопросы