JQuery $ .extend()递归特性

时间:2014-03-29 19:12:45

标签: javascript jquery extend

我想在数组中的特定位置扩展一个对象,而不必再次发送整个数组。

示例:

你从这个数组开始:

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快速浏览每个传感器。

编辑:忘记提及我是否

$.extend(true, node.sensors, newNodeData.sensors);

它的工作方式与第一个例子相同(即工作正常)

1 个答案:

答案 0 :(得分: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);