Разделите значение JSON, чтобы получить новый JSON со свойствами новостей

#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» и других…

2. скомпилируйте его в ES5

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 );
}
}
 

Я сделал первое разделение каждой строки, и для каждой строки я сделал еще одно разделение на «;».

Я получил ожидаемый результат. Спасибо большое за ваше предложение, они помогли мне понять, как работает карта, и адаптировать мой код, чтобы получить результат.

Я должен поместить результат в таблицу и работать с ним.