首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态添加js对象的更改值

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

Stack Overflow用户
提问于 2018-08-15 09:58:21
回答 1查看 115关注 0票数 1

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

代码语言:javascript
复制
var data = [
    {amount:20, speed:100},
    {amount:40, speed:50}
];

然后将数据添加到上面的数组中。

代码语言:javascript
复制
function addMore() {
    data = appendObjTo(data, {amount: 1500,speed:100});
}

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

数据正在被很好地添加,但是由于某种原因,我无法更改新数据的值。

代码语言:javascript
复制
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”的动态添加的数据不会改变。

为什么新的数据没有变化?

更新:参见此小提琴

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-15 10:37:42

在Object.freeze函数中使用appendObjTo。Object.freeze - Object.freeze()的定义.

由于frozenObj是使用Object.freeze()创建的,因此不允许更改值。另外,您在控制台上没有任何错误。JS不显示启用了错误w/o严格模式。我已经修改了小提琴,以包括严格的模式,你可以看到它抛出和错误,当你做data[key].amount = value.amount-perSec;。我还附加了一个小提琴来使用Object.freeze()方法,您可以自己进行实验。

改良小提琴

JS

代码语言:javascript
复制
(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();


})();

Object.freeze小提琴

代码语言:javascript
复制
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.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51856636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档