在 JavaScript 中将数据动态写入嵌套对象

如何解决在 JavaScript 中将数据动态写入嵌套对象

我想将数据(以对象的形式)作为值动态写入嵌套在另一个对象中的对象;并动态创建键的名称(在循环内)。

我当前的代码如下所示:

data = {'x': 2,'y': 3}

master_obj = {'useless': {},'important': {}}

var block_ind = 0
let trials = 12
let trials_per_block = 4
for (trial_ind=0; trial_ind<trials; trial_ind++) {
    // every 4 trials are in a new block
    block_ind = trial_ind % trials_per_block == 0 ? trial_ind/trials_per_block : block_ind
    
    master_obj['important']['block_0'+block_ind] = {}
    master_obj['important']['block_0'+block_ind]['trial_0'+trial_ind] = data
}
console.log(master_obj)

代码输出看起来像这样(也运行上面的代码片段):

Output of above snippet

而预期的输出是[一个区块内的多次试验,而不是一次]:

useless: {}
important:
    block_00:
        trial_00: {x: 2,y:3}
        trial_01: {x: 2,y:3}
        trial_02: {x: 2,y:3}
        trial_03: {x: 2,y:3}
    block_01:
        trial_04: {x: 2,y:3}
        trial_05: {x: 2,y:3}
        trial_06: {x: 2,y:3}
        trial_07: {x: 2,y:3}
    block_02:
        trial_08: {x: 2,y:3}
        trial_09: {x: 2,y:3}
        trial_10: {x: 2,y:3}
        trial_11: {x: 2,y:3}

感谢任何和所有帮助和建议!

解决方法

问题在于您不是在复制 data,您只是在重复使用相同的对象。另一个问题是,当您尝试将另一个实例添加到现有块时,您会覆盖之前创建的对象。

如何复制它是一个潜在的复杂主题(请参阅 this question's answers),但是对于仅对其自身的可枚举属性进行浅表复制,您可以对对象使用扩展符号或 Object.assign文字,请参阅下面的 *** 行:

const data = {"x": 2,"y": 3}

const master_obj = {"useless": {},"important": {}}

var block_ind = 0
let trials = 12
let trials_per_block = 4
const important = master_obj.important; // *** No need to repeat this
for (let trial_ind=0; trial_ind<trials; trial_ind++) {
//   ^^^−−−− *** Declare your variables
    // every 4 trials are in a new block
    block_ind = trial_ind % trials_per_block == 0 ? trial_ind/trials_per_block : block_ind

    // *** Only create this if it doesn't exist
    if (!important["block_0"+block_ind]) {
        important["block_0"+block_ind] = {}
    }
    important["block_0"+block_ind]["trial_0"+trial_ind] = {...data} // ***
}
console.log(master_obj)

另请注意,我在 constdata 上添加了 master_obj。如果没有 letconstvar,您的代码将成为我所说的 The Horror of Implicit Globals 的牺牲品。一定要声明你的变量。 (我建议始终使用 constlet,切勿使用 var。)


就其价值而言,您可以使用 Math.floor(trial_ind / trials_per_block) 来确定块编号。这是加上几个模板文字和其他具有描述性名称的常量:

const data = {"x": 2,"y": 3};

const master_obj = {"useless": {},"important": {}};

const trials = 12;
const trials_per_block = 4;
const important = master_obj.important;
for (let trial_ind = 0; trial_ind < trials; ++trial_ind) {
    // Every 4 trials are in a new block
    const blockKey = `block_0${Math.floor(trial_ind / trials_per_block)}`;

    const trialKey = `trial_0${trial_ind}`;

    if (!important[blockKey]) {
        important[blockKey] = {};
    }
    important[blockKey][trialKey] = {...data};
}
console.log(master_obj);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?