я объявил массив глобально, чтобы я мог изменить его внутри функции. но после того, как я попытаюсь изменить массив. массив показывает любые данные, и массив всегда становится равным 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 массив пустой. я попытался изменить условие длины, и оно не работает.
до сих пор не имеет поддержки.
Да, это объект с 2 массивами внутри. у обоих разное имя группы
Попробуйте использовать this.vehicleTypesArr
вместо просто vehicleTypesArr
в своих функциях
Спасибо, я попробовал, и это работает.
Код работает всеми (показанными) возможными способами помещения объекта в массив.
Похоже, проблема связана с вашим оператором 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
.
Является ли
this
объектом? Возможна проблема с прототипом объекта. Можно попробоватьObject.assign({}, this)
, который сделает глубокую копию объекта уровня 1. Для мульти уровня всегда можноJSON.parse(JSON.stringify(data))
или написать функцию копирования.