Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Генерация названий объектов - конкатенация названий объектов (https://javascript.ru/forum/misc/68762-generaciya-nazvanijj-obektov-konkatenaciya-nazvanijj-obektov.html)

smegol 06.05.2017 19:16

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

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

Например:

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


но так не работает.
Подскажите пожалуйста как такое можно сделать?

рони 06.05.2017 19:32

smegol,
делать из params массив и идти циклом.

Nexus 06.05.2017 19:39

Что-то типа этого нужно было сделать?
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]);

smegol 06.05.2017 20:15

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

var param = '.header.slogan';
this[this.props + param];

рони 06.05.2017 20:18

smegol,
пост №2, других решений нет

smegol 06.05.2017 20:20

Цитата:

Сообщение от рони (Сообщение 451804)
smegol,
делать из params массив и идти циклом.

Такой вариант выдаёт [object Object].header.slogan
Или я не правильно понял идею?

var param = ['.header.slogan'];
this.props + param;

рони 06.05.2017 20:22

smegol,
param = param.split(".")

Nexus 06.05.2017 20:25

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));

рони 06.05.2017 20:29

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));

Nexus 06.05.2017 20:37

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


Часовой пояс GMT +3, время: 06:56.