у меня вопрос к знатокам 🙂
Я пытаюсь сделать динамически генерируемое “дерево решений”. Данные которые нужны хранятся в глобальной переменной

const mainObj = {
second: {
name: ‘second’,
valueToOutput: “someString”,
},

third: {
name: ‘third’,
valueToOutput: “someString”,
},

first: {
name: ‘first’,
nextEls: [second, third]
}
}

При инициализации переменной сразу же выхватываю ошибку Uncaught ReferenceError: second is not defined, пробую инициировать через this

const mainObj = {
second: {
name: ‘second’,
valueToOutput: “someString”,
},

third: {
name: ‘third’,
valueToOutput: “someString”,
},

first: {
name: ‘first’,
nextEls: [this.second, this.third]
}
}

переменная инициируется. Но получаю такой объект по итогу

first: {
name: ‘first’,
nextEls: [undefined, undefined]
}

в этом и заключается суть проблемы – можно ли в свойствах ссылаться на свойства? И если да, то как это лучше реализовать?

задан 8 фев ’19 в 15:43

Достаточно хранить имена следующих элементов:

const mainObj = {
second: {
name: ‘second’,
valueToOutput: “someString”,
},

third: {
name: ‘third’,
valueToOutput: “someString”,
},

first: {
name: ‘first’,
nextEls: [‘second’, ‘third’]
}
}

Обращение к самому свойству становится тривиальным.

ответ дан 8 фев ’19 в 18:55

Лучше ничего сразу же не хардкодить.
Создайте пустой объект, затем последовательно его заполните:

const mainObj = {};

mainObj.second = {
name: ‘second’,
valueToOutput: “someString”
}

mainObj.third = {
name: ‘third’,
valueToOutput: “someString”
}

mainObj.first = {
name: ‘first’,
nextEls: [mainObj.second, mainObj.third]
}

ответ дан 8 фев ’19 в 16:55

Суть проблемы – во время создания объекта mainObj и его подобъекта first (то есть во время выполнения кода, возвращающего значения для свойств этих объектов), этих объектов еще нет.

function createMainObj() {
var result = {
second: {
name: ‘second’,
valueToOutput: “someString”,
},

third: {
name: ‘third’,
valueToOutput: “someString”,
},

first: {
name: ‘first’,
nextEls: []
}
};
result.first.nextEls.push(result.second);
result.first.nextEls.push(result.third);
return result;
}

const mainObj = createMainObj();
console.log(mainObj.first);

ответ дан 8 фев ’19 в 15:51

Вы можете использовать геттеры вместе с this, так как this актуально только для вызова методов, а не свойств. Но в геттерах этот способ будет иметь доступ только к тому же уровню вложенности (в вашем примере this относилось бы к объекту mainObj.first, если бы это было возможно):

const mainObj = {
second: 2,

third: 3,

get others() { return [this.second, this.third]; }
}

console.log(mainObj.others);

[ 2, 3 ]

ответ дан 8 фев ’19 в 17:47

Это лучше просто разбить на два действия:

const mainObj = {
second: {
name: ‘second’,
valueToOutput: “someString”,
},

third: {
name: ‘third’,
valueToOutput: “someString”,
},
}

mainObj.first = {
name: ‘first’,
nextEls: [mainObj.second, mainObj.third]
}

this лучше не использовать, так как во вложенных массивах/объектах контекст просто теряется.
А вообще для таких случаев лучше использовать классы с конструктором:
https://learn.javascript.ru/es-class

ответ дан 8 фев ’19 в 17:56

Всё ещё ищете ответ? Посмотрите другие вопросы с метками javascript или задайте свой вопрос.