Как объединить два загруженных массива в один массив JSON? - PullRequest
1 голос
/ 03 марта 2020

Я довольно новичок в изучении кода. Так что я могу неправильно понять многие основы.

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

Вот что я получил до сих пор:

//request the site and do some stuff with the data
rp(rpOptions)
    .then(function (parsedBody) {
        let incomingData1 = (parsedBody); //turning data into a value to change it a little
        incomingData1.forEach((incomingData1) => {incomingData1.yearsRetired = 0}); //to add a new property
        incomingData1 = JSON.stringify(parsedBody, ["favFood", "age", "work", "yearsRetired"], 2); //to filter only relevant properties into a JSON thing (i eventually want to save it to a txt file)
});

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

{
  "first_account_name": {
    "individual1": {
      "favFood": 'fries', 
      "age": 23,
      "work": 'astronaut'
      "yearsRetired": 0
    },
    "individual2": {
      "favFood": 'banana', 
      "age": 55,
      "work": 'zookeeper'
      "yearsRetired": 0
    {
      ...
    }
  },
  "second_account_name": { ... }
    "individual6": {
      "favFood": 'apple', 
      "age": 49,
      "work": 'dinosaur'
      "yearsRetired": 0
    "individual7": {
      "favFood": 'sausage', 
      "age": 33,
      "work": 'doctor'
      "yearsRetired": 0
    {
      ...
}

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

Большое спасибо и извините за смущение: P

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Если вы используете ES6

const processData = (data) => {
  return data.map((item) => ({
    favFood: item.favFood,
    age: item.age,
    work: item.work,
    yearsRetired: 0
  }))
}


// any value returned by then will be wrapped in promise 
// and can be `await` ed
// you can also use 
// const [ data1, data2 ] = await Promise.all([
//  rp(requestOption1).then(data => processData(data)),
//  rp(requestOption2).then(data => processData(data))
// ]) 
// if you want it to be executed parallely
const data1 = await rp(requestOption1).then(data => processData(data));
const data2 = await rp(requestOption2).then(data => processData(data));


const mergedData = [
  ...data1,
  ...data2
];

Если у вас нет asyn c await

const processData = (data) => {
  return data.map((item) => ({
    favFood: item.favFood,
    age: item.age,
    work: item.work,
    yearsRetired: 0
  }))
}

Promise.all(
  rp(requestOption1).then(data => processData(data)),
  rp(requestOption2).then(data => processData(data))
).then(results => {
  const mergedData = results.reduce((collection, result) => {
    return collection.concat(result);
  }, []);
})

Примечание:

  • I написал имя функции processData, потому что я не знаю, что обрабатывается. Я предлагаю вам быть более точным c в названии функции. (например, что он делает)
0 голосов
/ 03 марта 2020

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

Let accountDetails = [];

Далее, внутри функции вызовите эту переменную следующим образом:

rp(rpOptions)
    .then(function (parsedBody) {
        let incomingData1 = (parsedBody);
        incomingData1.forEach((incomingData1) => {incomingData1.yearsRetired = 0}); 
        incomingData1 = JSON.stringify(parsedBody, ["favFood", "age", "work", "yearsRetired"], 2);
        accountDetails.push({
              "individual1" : incomingData1 
        })
});
...