Атрибут пуст после присвоения

#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 был журналом с модификацией