Foreach над объектом в Angular - PullRequest
0 голосов
/ 09 января 2019

У меня небольшая проблема с моим кодом. У меня уже есть фрагмент кода на массиве (например: pic1) Я беру этот массив и поворачиваю его так: pic2

Вот кусок кода:

processPostData(data: any) {
    Array.prototype.forEach.call(data.resources, (element: any) => {
        console.log(element);
        Object.keys(element).forEach((key) => {
            console.log(key);
            if ((element[key] == null || element[key] == '') && ['process_limit_date', 'creation_date', 'closing_date', 'countAttachments', 'countNotes'].indexOf(key) === -1) {
                element[key] = this.lang.undefined;
            } else if (["senders","recipients"].indexOf(key) > 0) {
                if (element[key].length > 1) {
                    console.log(element[key]);
                    element[key] = this.lang.isMulticontact;
                } else {
                    element[key] = element[key][0];
                }
            } else if (key == 'status_icon' && element[key] == null) {
                element[key] = 'fa-question undefined';
            }

        });
    });

    return data;
}

Теперь проблема в том, что я изменяю свои входные «данные», и теперь у меня есть объект, например так: pic3

Теперь у меня есть объект вместо массива, и мне не удавалось пройти через него таким же образом, как раньше. Как я мог это сделать? По крайней мере, для первого цикла и получить массив или объект с содержимым индексов «23» и «24» объекта.

Скажите мне, если я не достаточно ясен, мне довольно трудно быть максимально точным

Ответы [ 4 ]

0 голосов
/ 09 января 2019

Будьте осторожны, я заметил, что вы воспринимаете resource.senders и resource.recipients как массив, тогда как на вашем скриншоте это строка.
Я также заметил, что если у вас более одного отправителя / получателя, вы назначите this.lang.isMulticontact для resource.senders / получателя, поэтому у вас больше не будет отправителей / получателей, это то, что вы хотите?

Обратите внимание, что вам не следует изменять параметр данных, это может привести к нежелательным побочным эффектам.

processPostData(data) {
  const dataToProcess = [...data];
  dataToProcess.resources.forEach((resource) => {
    const propertiesUndefined = ['process_limit_date', 'creation_date', 'closing_date', 'countAttachments', 'countNotes'];
    propertiesUndefined.forEach((property) => {
      if (!resource[property]) { 
        resource[property] = this.lang.undefined;
      }
    });
    const propertiesMultiContact = ['senders', 'recipients'];
    propertiesMultiContact.forEach((property) => {
      if (resource[property] instance of Array && resource[property].length > 1) {
        resource[property] = this.lang.isMulticontact;
      }
    });
   if (!resource['status_icon']) {
     resource['status_icon'] = 'fa-question undefined';
   }
  });
  return dataToProcess;
}
0 голосов
/ 09 января 2019

По умолчанию поля объекта не повторяются в режиме массива. Однако вы можете попытаться обернуть ваш обработчик следующим образом, чтобы иметь возможность анализировать как массив, так и форму объекта:

if(Array.isArray(input)) {
  /* Do what you are already doing */
} else { /* We are working with object */
  Object.keys(input).forEach((key) => {
    /* Here you can iterate over each key in object */
  })
}

Но все же, ваш вопрос довольно неясен

0 голосов
/ 09 января 2019

До того, как вы итерировали по data.resources С вашими изменениями вы должны перебрать data.resources.docs Попробуйте что-то вроде этого:

data.resources.forEach(resource => {
    console.log(resource);
    resource.docs.forEach(doc => {
        console.log(doc);
        // ...
    }
});
0 голосов
/ 09 января 2019

Я не уверен, правильно ли я вас понял, но вы можете выполнять итерации по таким объектам:

for(let key in object) {
let child = object[key];
// Your Code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...