JS: имя свойства объекта из переменной

210
04 ноября 2021, 23:20

Необходимо обратиться к вложенному свойству объекта js, имя которого задано переменной. Общая картина такова:

  1. Есть объект, имеющий 3 свойства. При этом третье свойство может иметь неограниченное количество вложенных свойств.

  2. Нужно добавить к этому третьему свойству объекта новое вложенное свойство.

Насколько я поняла, мне необходимо сначала посчитать количество вложенных свойств объекта. Что-то вроде этого:

var x = Object.keys(имя_объекта).lenth;

только для вложенных свойств.

Вопрос 1: Можно ли написать так?

var x = Object.keys(имя_объекта)[2].lenth;
var x++;

Вопрос 2: Как мне теперь добавить новое вложенное свойство (имя/номер которого задано в переменной x) и записать в него значение?

Надеюсь, мой вопрос можно понять. Заранее спасибо за помощь!

Пример объекта, в который нужно добавить новое свойство (например, 4):

var order = {
    name: "Петя",
    phone: "+79211234567",
    1:{'<tr><td>Однокомнатная квартира</td><td>метро Пионерская</td><td>пр.Королёва, 35</td>С мебелью<td>Все есть, пешком от метро, залог</td></tr>'},
    2:{'<tr><td>Однокомнатная квартира</td><td>метро пр.Большевиков</td><td>ул.Ворошилова, 12</td>С мебелью<td>Стеклопакеты, паркет, посудомоечная машина</td></tr>'},
    3:{'<tr><td>Студия</td><td>метро Московская</td><td>ул.Типанова, 4</td>Пустая<td>Для семейной пары</td></tr>'}
};

Как вариант, можно свойства объекта назвать flat1, flat2, .... flat4

Answer 1

Для вашего конкретного случая, это делается так

var order = { 
    name: "Петя", 
    phone: "+79211234567", 
    1: 'some data', 
    2: 'some data', 
    3: 'some data', 
}; 
 
function addNumKey(obj, val) { 
  const numKeys = Object.keys(obj) 
    .filter(key => !isNaN(key)) // нужны только числовые ключи 
    .map(Number) // делаем их настоящими числами 
    // сортируем на всякий случай 
    // ( в обратном порядке, что бы легче получить максимальный элемент, он будет первым 
    .sort((a, b) => b - a); 
   
  const nextKeyIndex = numKeys[0] + 1; 
  obj[nextKeyIndex] = val; 
} 
 
addNumKey(order, 'new value'); 
console.log(order);

Но, как написали в другом ответе, лучше для этого использовать массив, так как операция упрощается в разы.

Answer 2

Для такой задачи используют обычный массив, так:

let order = { 
  name: "Петя", 
  phone: "+79211234567", 
  trs: [ 
    '<tr><td>Однокомнатная квартира</td><td>метро Пионерская</td><td>пр.Королёва, 35</td>С мебелью<td>Все есть, пешком от метро, залог</td></tr>', 
    '<tr><td>Однокомнатная квартира</td><td>метро пр.Большевиков</td><td>ул.Ворошилова, 12</td> мебелью<td>Стеклопакеты, паркет, посудомоечная машина</td></tr>', 
    '<tr><td>Студия</td><td>метро Московская</td><td>ул.Типанова, 4</td>Пустая<td>Для семейной пары</td></tr>', 
  ], 
}; 
 
let newRow = '<tr><td colspan="5">Четвертая строка!</td></tr>'; 
order.trs.push( newRow ); 
 
console.log( order.trs[0] ); 
console.log( order.trs[1] ); 
console.log( order.trs[2] ); 
console.log( order.trs[3] ); 
 
let bubu = document.getElementById('bubu'); 
 
bubu.innerHTML = order.trs.join("");
td { 
  padding: 4px; 
  border: 1px solid #b89868; 
}
<table id="bubu"></table>

READ ALSO
Uncaught (in promise) DOMException

Uncaught (in promise) DOMException

Скрипт не воспроизводит аудиоПочему?

97
Не могу запустить скачанный код node.js

Не могу запустить скачанный код node.js

Загрузил код приложения с githab'а и не могу запустить у себя на компе

96
Как достать св-во из объекта

Как достать св-во из объекта

Есть объект ranges в качестве св-ва принимает объект {…}

87
Как форматировать данные перед записью в state react js

Как форматировать данные перед записью в state react js

При помощи axiosget приходят данные в массив в стейте, структура массива выглядит так:

179