Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как правильно формировать многомерный массив? (https://javascript.ru/forum/misc/83721-kak-pravilno-formirovat-mnogomernyjj-massiv.html)

raja 25.02.2022 00:50

как правильно формировать многомерный массив?
 
Формирую многомерный массив на основании значений полей формы:
formArray = $('#ApplicationSettings').serializeArray();

console.log('formArray');
console.log(formArray);
	
optionsArray = {};
for (var key in formArray) {
	optionsArray[formArray[key]['name']] = formArray[key]['value'];
}

console.log('optionsArray');
console.log(optionsArray);


в форме есть поля с названиями: dealStatusSelect[1], dealStatusSelect[2], dealStatusSelect[4]. Я хочу, чтобы они стали частями одного подмассива.
но в массиве "optionsArray":
Object { projectBeginSelect: "UF_CRM_1584163639", "dealCategorySelect[1]": "7", "dealStatusSelect[1]": "409", "dealStatusSelect[2]": "417", "dealStatusSelect[4]": "423" }

то есть скрипт понимает dealCategorySelect[1] как отдельное имя переменной, а не как имя массива и ключ.
Мне надо, чтобы в массиве было:
Object { projectBeginSelect: "UF_CRM_1584163639", "dealCategorySelect":["1": "409", "2": "417", "4": "423"]}

как это сделать?

voraa 25.02.2022 08:01

Не слишком понятно, чего вы хотите.

"dealCategorySelect[1]": "7"

А куда потом эта 7 делась? А 1 куда?

ksa 25.02.2022 11:19

Цитата:

Сообщение от raja
Мне надо, чтобы в массиве было:
Object { projectBeginSelect: "UF_CRM_1584163639", "dealCategorySelect":["1": "409", "2": "417", "4": "423"]}

Как вариант...
const old = { 
	projectBeginSelect: "UF_CRM_1584163639", 
	"dealCategorySelect[1]": "7", 
	"dealStatusSelect[1]": "409", 
	"dealStatusSelect[2]": "417", 
	"dealStatusSelect[4]": "423" 
}
const o = {}
const a = Object.keys(old)
a.forEach(key => {
	const i = key.indexOf('[')
	if (i === -1) {
		o[key] = old[key]
		return
	}
	const a = key.match(/[^\[\]]+/g)
	if (!o[a[0]]) o[a[0]] = []
	o[a[0]][a[1] - 1] = old[key]
})
alert(JSON.stringify(o))

raja 25.02.2022 12:30

Полный код:
<script type="text/javascript" src="jquery-3.3.1.min.js" ></script>
<form id="ApplicationSettings">
	<input type="text" name="dealStatusSelect[1]" value="1">
	<input type="text" name="dealStatusSelect[2]" value="2">
	<input type="text" name="dealStatusSelect[4]" value="4">
	<input type="text" name="projectBeginSelect" value="UF_CRM_1584163639">
	<input type="submit" >
</form>
<script>
formArray = $('#ApplicationSettings').serializeArray();

console.log('formArray');
console.log(formArray);
	
optionsArray = {};
for (var key in formArray) {
	optionsArray[formArray[key]['name']] = formArray[key]['value'];
}

console.log('optionsArray');
console.log(optionsArray);
</script>


<?
$optionsArray = [];
if(isset($_REQUEST)){
	foreach($_REQUEST as $k => $v){
		$optionsArray[$k] = $v;
	}
}

echo '<pre>';
print_r($optionsArray);
echo '</pre>';
?>


Почему в PHP массив сразу выглядит как
Array
(
    [dealStatusSelect] => Array
        (
            [1] => 1
            [2] => 2
            [4] => 4
        )

    [projectBeginSelect] => UF_CRM_1584163639
)

а в JS надо извращаться.

voraa 25.02.2022 13:11

Чего то вы не договариваете.
Откуда берется
"dealCategorySelect[1]": "7" ?

Откуда вообще dealCategorySelect берется?

ksa 25.02.2022 14:02

Цитата:

Сообщение от raja
Почему в PHP массив сразу выглядит как

Потому что он так сделан изначально. :D

Цитата:

Сообщение от raja
а в JS надо извращаться

Потому что это другой язык и он сделан еще лучше. Там просто у инпутов (и пр.контролов) будет одно имя, без всякого пхпэшного изврата с [N]...


Часовой пояс GMT +3, время: 11:43.