Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.05.2017, 19:16
Аспирант
Отправить личное сообщение для smegol Посмотреть профиль Найти все сообщения от smegol
 
Регистрация: 28.05.2015
Сообщений: 40

Генерация названий объектов - конкатенация названий объектов
Добрый день!

Есть необходимость обращаться к нужному свойству объекта исходля из параметров которые поступили из "вне" - для этого я хотел использовать конкатенацию.

Например:

// Параметры из "вне"
var params = 'header.slogan';
// Конкатенирую params с остальной частью объекта
this.props. + params
// В итоге получаю объект из которого могу вытянуть данные
this.props.header.slogan


но так не работает.
Подскажите пожалуйста как такое можно сделать?
Ответить с цитированием
  #2 (permalink)  
Старый 06.05.2017, 19:32
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

smegol,
делать из params массив и идти циклом.
Ответить с цитированием
  #3 (permalink)  
Старый 06.05.2017, 19:39
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,750

Что-то типа этого нужно было сделать?
var a={
    prop:'first',
    first:'Its first property',
    first_second:'Its second property',
    first_second_noFantasy:'Its true'
},
property_name='_second';

alert(a[a.prop+property_name]);
Ответить с цитированием
  #4 (permalink)  
Старый 06.05.2017, 20:15
Аспирант
Отправить личное сообщение для smegol Посмотреть профиль Найти все сообщения от smegol
 
Регистрация: 28.05.2015
Сообщений: 40

C вложенным объектом у меня не получилось - выдаёт undefined

var param = '.header.slogan';
this[this.props + param];
Ответить с цитированием
  #5 (permalink)  
Старый 06.05.2017, 20:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

smegol,
пост №2, других решений нет
Ответить с цитированием
  #6 (permalink)  
Старый 06.05.2017, 20:20
Аспирант
Отправить личное сообщение для smegol Посмотреть профиль Найти все сообщения от smegol
 
Регистрация: 28.05.2015
Сообщений: 40

Сообщение от рони Посмотреть сообщение
smegol,
делать из params массив и идти циклом.
Такой вариант выдаёт [object Object].header.slogan
Или я не правильно понял идею?

var param = ['.header.slogan'];
this.props + param;
Ответить с цитированием
  #7 (permalink)  
Старый 06.05.2017, 20:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

smegol,
param = param.split(".")
Ответить с цитированием
  #8 (permalink)  
Старый 06.05.2017, 20:25
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,750

var a={
		first:{
			first:'root->first->second'
		},
		second:'root->second'
	},
	property_name='first.first';

function get_object_property(object,property){
	if(typeof object!=='object')
		throw new Error('Invalid input data');
	
	property=property.split('.');
	for(var i in property){
		if(!property.hasOwnProperty(i))
			continue;
		
		var pr_name=property[i];
		if(object[pr_name])
			object=object[pr_name];
		else
			return null;
	};
	
	return object;
}

alert(get_object_property(a,property_name));

Последний раз редактировалось Nexus, 06.05.2017 в 20:28.
Ответить с цитированием
  #9 (permalink)  
Старый 06.05.2017, 20:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

smegol,
var params = 'header.slogan',
obj = {props: {header : {slogan : "всякая фигня"}}};
function fun(obj,params)
{
    return params.split(".").reduce(function(ob, key) {
    return ob[key]
},obj)
}

alert(fun(obj.props , params));
Ответить с цитированием
  #10 (permalink)  
Старый 06.05.2017, 20:37
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,750

Первый раз увидел метод "reduce", мне стыдно)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск