3

У меня есть объект JavaScript.Как получить значение свойства из объекта javascript

var obj = { Id: "100", Name: "John", Address: {Id:1,Name:"Bangalore"} } 
var dataToRetrieve= "Name"; 

function GetPropertyValue(object,dataToRetrieve){ 
     return obj[dataToRetrieve] 
} 
var retval = GetPropertyValue(obj,dataToRetrieve) 

Это прекрасно работает. Но если я попытаюсь получить значение значения свойства «Адрес.Найм»,

Нравится: var dataToRetrieve = "Address.Name"; показано на рисунке undefined.

Примечание: Переменная свойства задается пользователем из HTML. Его можно изменить в соответствии с требованиями пользователя (какое значение свойства он хочет).

То, что я хочу добиться:

1) Если dataToRetrieve = "Name", он должен дать мне "John",

2) Если dataToRetrieve = "Id", он должен дать мне "100",

3) Если dataToRetrieve = "Address.Name", то должен дать мне "Bangalore",

4) Если dataToRetrieve = "Address.Id", он должен предоставить мне 1

Plunkr здесь: PLUNKR

+1

Вы также можете быть заинтересованы в 'get' метода lodash в. https://lodash.com/docs#get – LukeP

ответ

7

Применение reduce() метод

var obj = { 
 
    Id: "100", 
 
    Name: "John", 
 
    Address: { 
 
    Id: 1, 
 
    Name: "Bangalore" 
 
    } 
 
} 
 

 
function GetPropertyValue(obj1, dataToRetrieve) { 
 
    return dataToRetrieve 
 
    .split('.') // split string based on `.` 
 
    .reduce(function(o, k) { 
 
     return o && o[k]; // get inner property if `o` is defined else get `o` and return 
 
    }, obj1) // set initial value as object 
 
} 
 

 

 
console.log(
 
    GetPropertyValue(obj, "Name"), 
 
    GetPropertyValue(obj, "Id"), 
 
    GetPropertyValue(obj, "Address.Name"), 
 
    GetPropertyValue(obj, "Address.Id"), 
 
    GetPropertyValue(obj, "Address.Idsd"), 
 
    GetPropertyValue(obj, "Addre.Idsd") 
 
)


Для более старой проверки браузера polyfill option of reduce method.

+2

Рекомендуется добавить защиту от 'undefined' значений, как в приведенном выше ответе. – renatoargh

+1

@renatoargh: обновленный –

+0

он работает хорошо. 1 вопрос: если obj, содержащий некоторое свойство массива, будет ли он работать?например, var obj = {Id: «100», имя: «John», адрес: [{Id: 1, адрес: «Bangalore»}, {Id: 2, адрес: «Mysore»}]}, а затем вызвать функцию как GetPropertyValue (obj, «Адрес [0] .Name»)? –

2

Используйте следующую функцию:

var obj = { Id: "100", Name: "John", 
 
      Address: [{ Id:1, Name:"Bangalore" }, { Id:2, Name: "Mysore" } ] }; 
 

 
function GetPropertyValue(object, dataToRetrieve) { 
 
    dataToRetrieve.split('.').forEach(function(token) { 
 
     if (object) object = object[token]; 
 
    }); 
 
    
 
    return object; 
 
} 
 

 
console.log(
 
    GetPropertyValue(obj, "Address.0.Name"), 
 
    GetPropertyValue(obj, "Address.1.Id"), 
 
    GetPropertyValue(obj, "Name"), 
 
    GetPropertyValue(obj, "Id"), 
 
    GetPropertyValue(obj, "Unknown"), 
 
    GetPropertyValue(obj, "Some.Unknown.Property") 
 
);

2
function GetPropertyValue(object,dataToRetrieve){ 
    var valueArray = dataToRetrieve.split("."); 
    if (valueArray.length <= 1) { 
    return object[valueArray]; 
    } else { 
    var res; 
    function browseObj(obj, valueArray, i) { 
     if (i == valueArray.length) 
     res = obj; 
     else 
     browseObj(obj[valueArray[i]], valueArray, i+1); 
    } 
    browseObj(object, valueArray, 0); 
    return res; 
    } 
} 
2

Я написал стандартный метод многократного использования для динамического доступа к вложенным свойствам. Это как

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

Это потребует динамических аргументов для вложенных свойств. Если они являются строковыми типами, они являются объектными свойствами, если тип номера - это индексы массива. Как только вы это сделаете, ваша работа станет очень простой. Давайте посмотрим ..

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 props = ["Address","Name"], 
 
     obj = { Id: "100", Name: "John", Address: {Id:1,Name:"Bangalore"} }, 
 
     val = obj.getNestedValue(...props); 
 
console.log(val); 
 
// or you can of course do statically like 
 
     val = obj.getNestedValue("Address","Name"); 
 
console.log(val);

Вы можете увидеть getNestedValue() и это близнец setNestedValue() работает на https://stackoverflow.com/a/37331868/4543207