#javascript #arrays #json #split
Вопрос:
Это мой первый пост сегодня, потому что я устал.
Я уже несколько дней пытаюсь сделать что-то простое, но не для меня…
У меня есть этот JSON :
[
{
"GpName":"AAAAAA",
"Contacts":"US;Toto;nESI;James;james@mail.com "
},
{
"GpName":"BBBBBB",
"Contacts":"ESI;Sebastien;sebastien@mail.comnUS;Ahmid;nESI;Stephane ;Stephane@mail.com"
},
{
"GpName":"CCCCCC",
"Contacts":"ESI;Marc;Marc@mail.comnUS;Olivier;olivier@mail.comnUS;Jean;jean@mail.com"
}
]
Я пытаюсь использовать функцию разделения массива, но у меня нет ожидаемого результата.
Как я мог получить :
[
{
"GpName":"AAAAAA",
"Contacts":["Zone":"US",
"User":"Toto"
"Mail": " "],
["Zone":"ESI",
"User":"James",
"Mail":"james@gmail.com "]
},
{
"GpName":"BBBBBB",
"Contacts":["Zone":"ESI",
"User":"Sebastien"
"Mail": "sebastien@mail.com"],
["Zone":"US",
"User":"Ahmid ",
"Mail":" "]
["Zone":"ESI",
"User":"Stephane",
"Mail":"Stephane@mail.com"]
},
{
"GpName":"CCCCCC",
"Contacts":["Zone":"ESI",
"User":"Marc"
"Mail": "Marc@mail.com"],
["Zone":"US",
"User":"Olivier",
"Mail":" "]
["Zone":"US",
"User":"Jean",
"Mail":"Jean@mail.com"]
}
]
Как вы можете видеть, иногда у меня есть электронная почта, иногда нет.
Любая помощь была бы очень признательна
Комментарии:
1. Не манипулируйте JSON, сначала разберите его на объект …
the split array function
— можете ли вы показать, что вы пробовали … нет функции разделения массива2. Пожалуйста, предоставьте код вашей
split
функциональности.3. Может быть, вы почти закончили, пожалуйста, поделитесь своей функцией разделения, и мы поможем вам увидеть, что вы пропустили.
Ответ №1:
используйте Array.split
разделение строки на подстроки и Array.map
для создания массива.
let input = [{ "GpName": "AAAAAA", "Contacts": "US;Toto;nESI;James;james@mail.com " }, { "GpName": "BBBBBB", "Contacts": "ESI;Sebastien;sebastien@mail.comnUS;Ahmid;nESI;Stephane ;Stephane@mail.com" }, { "GpName": "CCCCCC", "Contacts": "ESI; Marc; Marc@mail.comnUS; Olivier; olivier@mail.comnUS; Jean; jean@mail.com" }]
let result = input.map(({ GpName, Contacts }) => ({
GpName,
Contacts: Contacts.split("n").map(line => {
let [Zone, User, Mail] = line.split(";");
return { Zone, User, Mail }
})
}));
console.log(result)
Комментарии:
1. Большое спасибо за ваш ответ, похоже, это решение, но, как я уже сказал, я использую язык javascript ECMASCRIPT 5/ES5, и у меня нет «let»,»map» и других…
3. Tks для этого обновления я был в отпуске и не могу протестировать до сегодняшнего дня. Когда я запускаю это, используется функция map, но, как я уже сказал, map не работает в моей среде (vRO, от vmware). Я должен заменить карту другой вещью
4. Это то, что
map
функция делает:function map(array,fn) { let result = []; for (let i = 0; i < array.length; i ) result.push(fn(array[i],i,array)); return resu<}
5. Вот карта polyfill
Ответ №2:
Что я пробовал на своей стороне
var EsiEmailList = [];
var EsiEmailListJSON = [];
var myJSON = JSON.parse(BgManagerInfoList);
for (key in myJSON) {
gpInfo = myJSON[key];
var gpName= gpInfo.GpName;
var gpContact = gpInfo.Contacts;
EsiEmailListJSON.push(gpContact);
}
EsiEmailList=JSON.stringify(EsiEmailListJSON);
EsiEmailListSplit = EsiEmailListJSON/split("n");
for (data in EsiEmailListSplit){
contactInfo = EsiEmailListJSON[data];
System.log ("contactInfo: " contactInfo);
}
В результате получается что-то вроде этого :
**ContactInfo**: US;Toto;
ESI;James;james@mail.com
**ContactInfo**: ESI;Sebastien;sebastien@mail.com
US;Ahmid;
ESI;Stephane;Stephane@mail.com
**ContactInfo**:ESI;Marc;Marc@mail.com
US;Olivier;olivier@mail.com
US;Jean;jean@mail.com
Ответ №3:
та же проблема : Ошибка в (Рабочий процесс:функция тестирования / сопоставления (пункт 1)#37) Ошибка типа: Не удается найти карту функций в объекте, я протестировал заполнение, но здесь код не работает
if (!Array.prototype.map) {
Array.prototype.map = function(callback/*, thisArg*/) {
var T, A, k;
if (this == null) {
throw new TypeError('this is null or not defined');
}
var O = Object(this);
var len = O.length >>> 0;
if (typeof callback !== 'function') {
throw new TypeError(callback ' is not a function');
}
if (arguments.length > 1) {
T = arguments[1];
}
A = new Array(len);
k = 0;
while (k < len) {
var kValue, mappedValue;
if (k in O) {
kValue = O[k];
mappedValue = callback.call(T, kValue, k, O);
A[k] = mappedValue;
}
k ;
}
return A;
};
}
var input = [{ "GpName": "AAAAAA", "Contacts":
"US;Toto;nESI;James;james@mail.com " }, { "GpName": "BBBBBB", "Contacts":
"ESI;Sebastien;sebastien@mail.comnUS;Ahmid;nESI;Stephane ;Stephane@mail.com"
}, { "GpName": "CCCCCC", "Contacts": "ESI; Marc; Marc@mail.comnUS; Olivier;
olivier@mail.comnUS; Jean; jean@mail.com" }];
var result = input.map(function (_a) {
var GpName = _a.GpName, Contacts = _a.Contacts;
return ({
GpName: GpName,
Contacts: Contacts.split("n").map(function (line) {
var _a = line.split(";"), Zone = _a[0], User = _a[1], Mail = _a[2];
return { Zone: Zone, User: User, Mail: Mail };
})
});
});
Могу ли я использовать для каждого вместо карты, что-то вроде этого :
var inputJSON = JSON.parse(BgManagerInfoList);
for each(a in inputJSON ){
var GpName = a.GpName;
var Contacts = a.Contacts;
//System.log ("GpName: " GpName);
//System.log ("Contacts: " Contacts);
for each(b in Contacts){
b = line.split(";");
var Zone = b[0];
var User = b[1];
var Mail = b[2];
System.log ("Zone:" Zone ", User: " User ", Mail: " Mail );
}
}
У меня есть значение для GpName и контактов, но для каждого из них оно не работает для контактов
Комментарии:
1. Это должно работать, прежде всего, поддержка ES5
Array.prototype.map
, я думаю, что какая-то библиотека или среда выполнения могут повлиять на прототип сборки… Снимитеif
блокif (!Array.prototype.map) { ... }
. Таким образом, это принудительно переопределит функциональность карты по умолчанию, ИЛИ вы можете попробоватьmap
функцию, я уже делюсь этим кодом:function map(array,fn) { let result = []; for (let i = 0; i < array.length; i ) result.push(fn(array[i],i,array)); return resu<}
2. Работает ли другая функция встроенного массива? нравится
forEach
илиfilter
?
Ответ №4:
Я нашел решение своей проблемы :
var input = JSON.parse(BgManagerInfoList);
for each(a in input){
var GpName = a.GpName ;
var Contacts = a.Contacts;
//System.log ("GpName: " GpName);
contactSplit = Contacts.split('n');
System.log ("Contacts: " Contacts);
for each (a in contactSplit){
var ContactOnly = a.split(";");
//System.log ("ContactsSplit: " ContactsSplit);
var Zone = ContactOnly[0];
var User = ContactOnly[1];
var Mail = ContactOnly[2];
System.log ("Zone:" Zone ", User: " User ", Mail: " Mail );
}
}
Я сделал первое разделение каждой строки, и для каждой строки я сделал еще одно разделение на «;».
Я получил ожидаемый результат. Спасибо большое за ваше предложение, они помогли мне понять, как работает карта, и адаптировать мой код, чтобы получить результат.
Я должен поместить результат в таблицу и работать с ним.