Всем привет. Хотел бы узнать мнение опытных кодеров, почему такое поведение у метода filter.
Вообщем изучая Ajax мне стало интересно, а можно ли получить массив с сервера не преобразовывая его методом $dataSer = json_encode($_SERVER);
и получая на клиенте let data = JSON.parse(data);
, а тупо закинуть на сервере print_r($_SERVER);
и попытаться воссоздать на клиенте результат который бы я получил парсом.
На клиенте т.к. в чистом виде
Array
(
[HTTP_HOST] => localhost
[HTTP_CONNECTION] => keep-alive
[HTTP_ORIGIN] => http://127.1.0.0:5500
и т.д.
Я начинающий и скажем план готовил на ходу примерно должно было так. Мне нужно для начала получить чистые массивы построчно, а потом я предполагал их делить убрав при этом =>. Ну далее что нибудь
let regV = /\[\w+]\s=>\s.+/g;//выбирает строку от [ и до конца строки
let arr = data.match(regV);
console.dir(arr);
//результат
0: "[HTTP_HOST] => localhost"
1: "[HTTP_CONNECTION] => keep-alive"
2: "[HTTP_ORIGIN] => http://127.1.0.0:5500"
Вот дальше меня удивило.
let spl = arr[0].split('=>');//нормально
//результат
0: (2) ["[HTTP_HOST] ", " localhost"]
Ну думаю создам фильтр
let arrFilter = arr.filter((item)=>{
console.dir(item.split('=>'));//тут норм, на выходе не норм
return item.split('=>');
});
console.dir(arrFilter);
//никакого результата
0: "[HTTP_HOST] => localhost"
1: "[HTTP_CONNECTION] => keep-alive"
2: "[HTTP_ORIGIN] => http://127.1.0.0:5500"
Что не так? метод map справился с этой задачей. /------------------------------------------------------------------/
Вот немного велосипеда. Ассоциативный массив на php можно передать прямо так
print_r($_SERVER);
//var_export($_SERVER): или так.
И получить на JS. Работает как на обычном объекте так и на Map.
function requesServer(data){
let regExpForMatch = /'.+|\[.+/gmi;
let regExpForSplit = /['\[]|^\)|['\]]| => |\,$/gmi;
let arrMatch = data.match(regExpForMatch);//выборка нужного текста построчно в массив
let dataServer = {};//данные перенёс в объект
let arrMap = arrMatch.map((item)=>{
let arrSplit = item.split(regExpForSplit);
if(arrSplit[3] === ""){
for(let i = 2; i <= arrSplit.length; i++){
if(i==arrSplit.length-1){dataServer[arrSplit[1]] = ''; break;}
if(arrSplit[i]==''){continue;}
dataServer[arrSplit[1]] = arrSplit[i]; break; }
}else{
dataServer[arrSplit[1]] = arrSplit[3]
}
return [arrSplit[1], (arrSplit[3] == "")?arrSplit[4]:arrSplit[3]];
});
let dataServer1 = new Map(arrMap);//можно закинуть
console.dir(dataServer);
console.dir(dataServer1);
}
Я конечно не понимаю что за велосипед вы изобретаете, но вот на выходе всё вполне ожидаемо:
То есть вот вы разбили строку на массив строк "[Ключ] => значение", после чего фильтр преобразует массив вот так:
// Было
[
"[Ключ0] => значение0",
"[Ключ1] => значение1",
...
]
// Стало
[
["[Ключ0] ", " значение0"],
["[Ключ1] ", " значение1"],
...
]
Если Вам нужно превратить это всё в обьект, то придётся продежаться по всем парам вот так:
let obj = {}
for (let i = 0; i < arrFilter.length; i++) {
let keyValue = arrFilter[i]
obj[keyValue[0]] = keyValue[1]
}
Но лучше конечно использовать JSON, потому что искать нужную пару по массиву пар, где ключи ещё нужно проверять на равенство искомому ключу... Ну это жесть вообщем.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Прошу прощения за тупость, но может найдётся кто нибудь, кто подскажет чайнику как вывести результаты (obj) в форму? Мне не важен конкретный...
Задача заключается в том, чтобы создать функцию, которая возвращает сумму последовательности целых чиселПоследовательность определяется...
По клику на кнопку, должна меняться прозрачность div с "ТЕКСТ1", потом должен плавно появлятся "ТЕКСТ2" в этом блоке