#javascript #arrays #asynchronous #scope #synchronous
Вопрос:
Я пытаюсь преобразовать объект в массив, чтобы он соответствовал 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)
точечную карту атрибута, она пуста.
Есть какие-нибудь идеи о том, почему это происходит ?
Редактировать: как указано ниже, этот код работает с образцами данных, поэтому я полагаю, что это должно быть связано с тем, как вызывается функция. Все работает в виджете UWA с помощью jQuery
Итак, для контекста здесь есть представление о том, как они называются в обоих случаях :
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);
});
Это работает на кнопке 1, но не на кнопке 2, они нажимаются в другой момент, но данные содержат один и тот же объект при нажатии на оба
Правка2 :
Обнаружена проблема, В манипуляциях с jsonData я случайно использую slice(1,1) вместо splice(1,1), который очищает массив.
Что сводило меня с ума, так это то, что эта модификация была выполнена после журнала, но var был журналом с модификацией.
По крайней мере, я узнал, что оператор распространения не делает глубокой копии
Комментарии:
1. не кажется ли вам, что было бы здорово поместить входные данные, которые вы используете для тестирования этой функции, в вопрос?
2.
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);
Он работает с образцами данных.3. Просто догадываюсь, но … .. оператор распространения не выполняет глубокое копирование, возможно, вы изменяете выходные jsonLayers между двумя вызовами, и это влияет на объект входных данных. Пожалуйста, не могли бы вы попытаться свести свой пример к минимуму, который показывает проблему?
4. Я попытался воспроизвести контекст проблемы, я попытаюсь глубоко скопировать с помощью JSON
5. @Maxence Fiorina, если вы пытаетесь клонировать с
{...data}
помощью , вы ошибаетесь , это только поверхностное копирование, И что этоtabList
такое ? И каков ваш ожидаемый результат ?
Ответ №1:
Обнаружена проблема,
В манипуляциях с jsonData я случайно использую slice(1,1) вместо splice(1,1), который очищает массив.
Что сводило меня с ума, так это то, что эта модификация была выполнена после журнала, но var был журналом с модификацией