【发布时间】: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