Javascript 更改动态添加的js对象的值

Javascript 更改动态添加的js对象的值,javascript,jquery,arrays,jsobject,Javascript,Jquery,Arrays,Jsobject,我有一个带有一些预定义数据的数组 var data = [ {amount:20, speed:100}, {amount:40, speed:50} ]; 然后我将数据添加到上面的数组中 function addMore() { data = appendObjTo(data, {amount: 1500,speed:100}); } function appendObjTo(thatArray, newObj) { const frozenObj = Ob

我有一个带有一些预定义数据的数组

var data = [
    {amount:20, speed:100},
    {amount:40, speed:50}
];
然后我将数据添加到上面的数组中

function addMore() {
    data = appendObjTo(data, {amount: 1500,speed:100});
}

function appendObjTo(thatArray, newObj) {
    const frozenObj = Object.freeze(newObj);
    return Object.freeze(thatArray.concat(frozenObj));
}
正在添加数据,但由于某些原因,我无法更改新数据的值

function runData() {
    perSec = 0;
    $.each(data, function( key, value ) {
        perSecCalc = Math.round(value.speed/60);
        perSec += perSecCalc;
        // Below line works only for predefined objects, but not objects from "addMore()"
        data[key].amount = value.amount-perSec;
    });

    setTimeout(function() {
        runData();
    },1000);
}
当“var data”中的预定义对象被更改时,“addMore”中动态添加的数据不会更改

为什么新数据没有改变

更新
appendObjTo
函数中使用Object.freeze,请参见此。Object.freeze-的定义

由于frozenObj是使用
Object.freeze()
创建的,因此不允许更改值。另外,您在控制台上也不会得到任何错误。JS在未启用严格模式的情况下不显示错误。我已经修改了fiddle以包含strict模式,您可以看到,当您执行
data[key].amount=value.amount-perSec时,它会抛出并出错。我还附加了一把小提琴来处理Object.freeze()方法,您可以自己进行实验

JS


你能把appendObjTo代码显示出来吗?请看这里:你只调用了一次
addMore
?是的,在这个测试示例中,我是这样做的,但最终它会在出现新数据时被调用。你为什么要使用
freeze
(function () {

"use strict";

var data = [
    {amount:20, speed:100}
];


function runData() {
    var perSec = 0;
    $.each(data, function( key, value ) {
        var perSecCalc = Math.round(value.speed/60);
        perSec += perSecCalc;
        // Below line works only for predefined objects, but not objects from "addMore()"
        data[key].amount = value.amount-perSec;
        $('#test').prepend(data[key].amount+'<br>');
    });

    setTimeout(function() {
        runData();
    },1000);
}

function appendObjTo(thatArray, newObj) {
  const frozenObj = Object.freeze(newObj);
  return Object.freeze(thatArray.concat(frozenObj));
}

function addMore() {
    data = appendObjTo(data, {amount: 1500,speed:100});
}

setTimeout(function() { addMore(); },1500);

runData();


})();
var arr = [10, 20, 30];
console.log(arr);

arr = Object.freeze(arr.concat([40, 50]));
console.log(arr);

arr[3] = 80;
console.log(arr); // doesn't change

// arr.push(60); // error, cannot add property 5, object is not extensible

arr = Object.freeze(arr.concat([{ x: 100 }]));
console.log(arr);

arr[5].x = 200;
console.log(arr); // changes, as Object.freeze only locks the first level values.