Всем привет. Хотел бы узнать мнение опытных кодеров, почему такое поведение у метода 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, потому что искать нужную пару по массиву пар, где ключи ещё нужно проверять на равенство искомому ключу... Ну это жесть вообщем.
Прошу прощения за тупость, но может найдётся кто нибудь, кто подскажет чайнику как вывести результаты (obj) в форму? Мне не важен конкретный...
Задача заключается в том, чтобы создать функцию, которая возвращает сумму последовательности целых чиселПоследовательность определяется...
По клику на кнопку, должна меняться прозрачность div с "ТЕКСТ1", потом должен плавно появлятся "ТЕКСТ2" в этом блоке