【问题标题】:Attribute empty after assigning分配后属性为空
【发布时间】:2021-08-19 12:32:54
【问题描述】:

我正在尝试将一个对象重构为一个数组以适应我必须使用的 API。

function buildObject(data) {
    console.log(data) // correct ouput
    var jsonLayers = Object.entries({...data}).map(([k, v]) => {
        console.log(`value : ${v}`) // correct output
        return {
            label: k,
            pointMap: v,
            color: v.layerColor?v.layerColor:tabList[tabList.map(i => i.tabName).indexOf(k)].layerColor?tabList[tabList.map(i => i.tabName).indexOf(k)].layerColor:defaultPOILayerColor,
        }}
    )

    console.log(jsonLayers) // incorrect output
    return jsonLayers
}

我有 2 个场景调用此函数,但使用相同的数据(console.log(data) 记录完全相同的结果)。 在第一种情况下,我获得了所需的结果,而在第二种情况下,pointMap 属性是一个空数组。

如果它不起作用,console.log(`value : ${v}`) 会记录正确的值,但是当我记录 console.log(jsonLayers) 时,属性 pointMap 为空。

关于为什么会发生这种情况的任何想法?

编辑:正如下面提到的,这段代码适用于示例数据,所以我想这必须涉及到函数的调用方式。一切都在使用 jQuery 的 UWA 小部件中运行

因此,对于上下文,这里是关于在这两种情况下如何调用它们的想法:

var data = {
    a: { tabName: "tab1", layerColor: 1 },
    b: { tabName: "tab2", layerColor: 2 },
};

$('#button1').on('click', function() {
    ExternalAPI.Publish('some-external-address', buildObject(data));
});

$('#button2').on('click', function() {
    let jsonData = buildObject(data);
    //some manipulations of jsonData
    ExternalAPI.Publish('some-external-address', jsonData);
});

它适用于button1,但不适用于button2,它们被点击的时间不同,但两者都被点击时数据包含相同的对象

编辑2:

发现问题, 在 jsonData 的操作中,我不小心使用了 slice(1,1) 而不是 splice(1,1) 清空了数组。

让我抓狂的是,这个修改是在 log 之后执行的,但是 var 是 log 与修改。

至少我知道传播运算符不深复制

【问题讨论】:

  • 您不认为将您用于测试此功能的输入放在问题上可能是一件好事吗?
  • const data = { a: { tabName: "tab1", layerColor: 1 }, b: { tabName: "tab2", layerColor: 2 }, }; function buildObject(data) { var jsonLayers = Object.entries({ ...data }).map(([k, v]) => { return { label: k, pointMap: v, color: v.layerColor }; }); console.log(jsonLayers); return jsonLayers; } buildObject(data); 它适用于样本数据。
  • 只是猜测,但 ... 扩展运算符不会进行深度复制,您是否可能在两次调用之间改变了输出 jsonLayers,这会影响输入数据对象。请您尝试将您的示例减少到显示问题的最低限度吗?
  • 我尝试复制问题的上下文,我将尝试使用 JSON 进行深度复制
  • @Maxence Fiorina,如果你想用{...data}克隆,你错了,它只做浅拷贝,tabList是什么?你的预期输出是什么?

标签: javascript arrays asynchronous scope synchronous


【解决方案1】:

发现问题,

在对 jsonData 的操作中,我不小心使用了 slice(1,1) 而不是 splice(1,1),这会清空数组。

让我抓狂的是,这个修改是在日志之后执行的,但是 var 是与修改一起记录的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多