манипуляции с объектами в массиве - PullRequest
1 голос
/ 17 апреля 2019

Это сложная задача для меня.У меня есть массив объектов.Мне нужно пройти через массив, если есть ключ «сообщения», добавить его в новый массив.Но тут есть хитрость.Если 'render' - true, мне нужно получить "stageID" (например, в элементе fisrt stadeID = 3) и перейти к третьему элементу в этом массиве, получить "message", если он есть, снова добавить его в массив и проверитьдля статуса «рендеринга» продолжайте цикл, пока рендер не станет ложным.Если в элементе нет ключа 'message', но render - true, в любом случае мне нужно перейти к элементам по его stageID.

P / SI всегда нужно получать сообщение от первого элемента, не имеет значения, если renderправда или нет

[
  {
    "algID": 0,
    "render": true,
    "message": "first message",
    "stageID": "3"
  },
  {
    "algID": 0,
    "render": false,
    "message": "second message",
    "message_type": "text"
  },
  {
    "algID": 0,
    "render": true,
    "message": "third message",
    "message_type": "text",
    "stageID": "5"
  },
  {
    "algID": 0,
    "render": false
  },
  {
    "algID": 0,
    "render": false,
    "stageID": "4"
  },
  {
    "algID": 0,
    "render": false
  }
]

Вот моя функция.Я добавляю первый элемент 'message' в массив, проверяя на 'render', но я понятия не имею, как зациклить его перемещение по массиву, используя 'stageID'

displayData(step) {
  let arrayWithMessage=[]
      for (let z = 0; z < step.length; z++) {
        if ("message" in step[z]) {
          arrayWithMessage.push(step[z].message)
        }
        if (step[z].render === true) {
          console.log("reder true", step[step[z].stageID - 1])
        }
      }
  }

ожидаемый вывод: ['first message',«третье сообщение»]

Ответы [ 3 ]

2 голосов
/ 17 апреля 2019

Вы можете перебрать массив и взять либо следующий элемент, либо stageID - 1 в качестве нового индекса.

var data = [{ algID: 0, render: true, message: "first message", stageID: "3" }, { algID: 0, render: false, message: "second message", message_type: "text" }, { algID: 0, render: true, message: "third message", message_type: "text", stageID: "5" }, { algID: 0, render: false }, { algID: 0, render: false, stageID: "4" }, { algID: 0, render: false }],
    result = [],
    i = 0;

while (data[i]) {
    if (data[i].message) result.push(data[i].message);
    if (data[i].render) {
        i = data[i].stageID - 1;
        continue;
    }
    i++;
}

console.log(result);
0 голосов
/ 17 апреля 2019

Редактировать: является ли stageID - 1 индексом следующего связанного сообщения?Если да, это решение или Ninas является corrent.

Я интерпретировал I need to get "stageID"(for instance in fisrt element stadeID = 3 ) and move to the third element in that array как, если stageID = 3, следующий элемент является 3-м элементом массива.


Если Iправильно понял логику, что-то вроде этого может работать:

Мы создаем отдельную функцию, которая будет извлекать все посты, в которых рендер верен и сообщение существует.

Затем мы можем просто отобразить этот массив

Преимущество заключается в том, что мы можем легко использовать его в функции отображения, чтобы сделать это для всех сообщений.

const posts = [
  { "algID": 0, "render": true, "message": "first message", "stageID": "3" },
  { "algID": 0, "render": false, "message": "second message", "message_type": "text" },
  { "algID": 0, "render": true, "message": "third message", "message_type": "text", "stageID": "5" },
  { "algID": 0, "render": false },
  { "algID": 0, "render": false, "stageID": "4" },
  { "algID": 0, "render": false }
];

const find_message_chain = post => {
  const index = parseInt( post.stageID ) - 1;
  // If we have render: true, we will need to look for the next post as well.
  // By recursively calling find_chain and concatenating all the results, we get a single, one lvel deep array instead of nested arrays we have to .flat() at the end.
  if ( post.render && post.message ) return [ post.message, ...find_message_chain( posts[ index ]) ];
  // If we do not have render true, but do have a message, this post will br the last one in the chain, so we return it.
  else if ( post.message ) return [ post.message ];
  // If no message exists, we do not want to return the post, since the chain ends.
  else return [];
};

const messages_for_post_0 = find_message_chain( posts[ 0 ] );

console.log( messages_for_post_0 );

const all_messages_per_post = posts.map( find_message_chain );

console.log( all_messages_per_post );

Sidenote 1: я бы добавил фактический идентификатор к сообщениям, поэтому нам не нужно полагаться на индекс массива исходных данных (сообщений), чтобы определить, какое сообщение являетсясвязан с какой другой публикацией.

Sidenote 2: функция рекурсивной цепочки может быть легко сделана менее точной, чтобы можно было произвольно извлекать любое значение, не только сообщения.

0 голосов
/ 17 апреля 2019

Пусть ваш массив хранится в переменной a

var messages = [];

function getMessage(index) {
    if (a[index - 1].message !== undefined) {
        messages.push(a[index - 1].message);
    }
    if (a[index - 1].render) {
        getMessage(a[index - 1].stageID);
    }
}

getMessage(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...