Я хочу расширить объект в определенной позиции в массиве, не отправляя весь массив снова.
Пример:
Вы начинаете с массива следующим образом:
sensors = [{value: 10}, {value: 20}];
Теперь скажите, что я хочу изменить значение второго датчика, я могу сделать это в jQuery:
newSensorValue = {1: {value:30}};
$.extend(true, sensors, newSensorValue);
// sensors = [{value: 10}, {value: 30}];
Однако, если массив не является непосредственно объединенным объектом, это не работает:
node = {x: 10, y: 10, node_id: 1, sensors: [
{sensor_id: 1, value: 10},
{sensor_id: 2, value: 20}
]};
newNodeData = {sensors: {
1: {value:30}
}};
$.extend(true, node, newNodeData);
// node = {x: 10, y: 10, node_id: 1, sensors: {
// 1: {value:30}
// }};
Почему $.extend() внезапно ведет себя по-другому, если массив вложен в объект?
Мое собственное решение состояло в том, чтобы создать массив пустых объектов, только предоставляя объект, который я хочу изменить атрибут "значение", например:
newNodeData = {sensors: [
{}, {value: 30}
]};
Поскольку это кажется довольно уродливым, есть ли лучший способ сделать это? Я бы предпочел держать датчики атрибутом массива, так как мне нравится использовать forEach для быстрого прохождения каждого датчика.
EDIT: забыл упомянуть, что если я это сделаю
$.extend(true, node.sensors, newNodeData.sensors);
Он работает так же, как в первом примере (т.е. работает)
Вы можете оставить элемент пустым, если вы не хотите его изменять.
node = {x: 10, y: 10, node_id: 1, sensors: [
{sensor_id: 1, value: 10},
{sensor_id: 2, value: 20}
]};
newNodeData = {sensors: [,{value:30}]};
$.extend(true, node, newNodeData);