Почему значения, помещенные в массив, недоступны, даже если массив объявлен глобально доступным?

я объявил массив глобально, чтобы я мог изменить его внутри функции. но после того, как я попытаюсь изменить массив. массив показывает любые данные, и массив всегда становится равным 0.

отсюда функция вызывается:

var vehicleTypesArr = []; //globally accessable.

function loadVehicleTypes(data) {
            if (data != null) {
                var res = data.VehicleTypes;
                if (res != '' && res != null) {
                    $.each(res, function () {
                        if (res.GroupName === 'ConEnhTyp_Vehicle')
                            vehicleTypesArr.push(this);
                           //console() : if i put a console here, the result will the data with specific groupName and prints until the loop is ended with the data.
                    });
                }
            }
            console.info(JSON.stringify(vehicleTypesArr)); // console 1 : result = 0
            resetVehicleTypes(); //here i call 2nd code snippet
};

Это второй фрагмент кода:

function resetVehicleTypes() {
  alert("1");
  if (vehicleTypesArr.length > 0) {
  alert("2");
    $.each(vehicleTypesArr, function (val) {
      val.prop('checked', false); 
  });
  alert("1");
  }
  alert("Finished");
}

код входит в функцию и предупреждает 1, а затем переходит к готовому предупреждению.

Я попытался,

на console(): я поставил консоль, и в результате были данные с определенным именем группы и печатались до тех пор, пока цикл не закончился с данными.

но в консоли 1 массив пустой. я попытался изменить условие длины, и оно не работает.

до сих пор не имеет поддержки.

Является ли this объектом? Возможна проблема с прототипом объекта. Можно попробовать Object.assign({}, this), который сделает глубокую копию объекта уровня 1. Для мульти уровня всегда можно JSON.parse(JSON.stringify(data)) или написать функцию копирования.

Flewz 17.11.2022 13:30

Да, это объект с 2 массивами внутри. у обоих разное имя группы

joseph thomas 18.11.2022 04:23
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
0
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте использовать this.vehicleTypesArr вместо просто vehicleTypesArr в своих функциях

Спасибо, я попробовал, и это работает.

joseph thomas 23.11.2022 12:12
Ответ принят как подходящий

Код работает всеми (показанными) возможными способами помещения объекта в массив. Похоже, проблема связана с вашим оператором if в каждом цикле. Я рекомендую всегда использовать {} брекеты. Угадать условие res.GroupName === 'ConEnhTyp_Vehicle' никогда не бывает правдой...

const result1 = document.getElementById('result1');

var vehicleTypesArr = []; //globally accessable.
const some_data = {
  VehicleTypes: [{
      GroupName: 'name 1'
    },
    {
      GroupName: 'name 2'
    }
  ]
};

loadVehicleTypes(some_data);

function loadVehicleTypes(data) {
  if (data != null) {
    var res = data.VehicleTypes;
    if (res != '' && res != null) {
      // alternative to for loops
      //vehicleTypesArr = res.filter(el => el.GroupName === 'ConEnhTyp_Vehicle');
    
      $.each(res, function() {
        // edit: should be this.GroupName instead of res.GroupName
        //if (res.GroupName === 'ConEnhTyp_Vehicle') // not needed for test
        vehicleTypesArr.push(this); // works
        vehicleTypesArr.push(JSON.parse(JSON.stringify(this))); // works
        vehicleTypesArr.push(Object.assign({}, this)); // works
        vehicleTypesArr.push({ ...this
        }); // works
      });

      /*
      for (const el of res) {
        vehicleTypesArr.push(el); // works
        vehicleTypesArr.push(JSON.parse(JSON.stringify(el))); // works
        vehicleTypesArr.push(Object.assign({}, el)); // works
        vehicleTypesArr.push({ ...el
        }); // works
      }
      */
    }
  }

  result1.innerHTML = JSON.stringify(vehicleTypesArr);
};
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id = "result1">test</div>

Обновлено:
Оглядываясь на это. Оператор if проверяет res.GroupName, когда он должен проверять this.GroupName.

Другие вопросы по теме