Особенность рекурсивности JQuery $ .extend ()

0

Я хочу расширить объект в определенной позиции в массиве, не отправляя весь массив снова.

Пример:

Вы начинаете с массива следующим образом:

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

Он работает так же, как в первом примере (т.е. работает)

  • 0
    взгляните на stackoverflow.com/questions/13280232/…
  • 0
    Если я правильно понимаю эту версию, я должен дать какое-то дополнительное свойство (например, sensor_id), по которому код затем решит объединить массив или нет, я прав?
Теги:
extend

1 ответ

0
Лучший ответ

Вы можете оставить элемент пустым, если вы не хотите его изменять.

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);
  • 0
    Сколько дополнительной памяти будет стоить такой подход? Просто в интересах эффективности

Ещё вопросы

Сообщество Overcoder
Наверх
Меню