首页 > 解决方案 > 如何将两个下载的数组合并为一个 JSON 数组?

问题描述

我对学习编码很陌生。所以我可能会弄错很多基础知识。

基本上我正在通过请求承诺从两个不同的帐户下载 API 内容,并希望将它们合并到一个更大的数组中。我正在努力从 request-promise 函数中转义我的本地数据并将其与第二个数组结合起来

这是我到目前为止得到的:

//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
    {
      ...
}

如何将我的数据放入 rp 之外的变量中?以及如何设置它以使其最终像嵌套数组一样?

非常感谢,很抱歉让您感到困惑:P

标签: javascriptarraysnode.jsjsonrequest-promise

解决方案


如果你使用 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
];

如果您没有异步等待

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);
  }, []);
})

笔记:

  • 我写了函数名processData,因为我不知道正在处理什么。我建议您更具体地了解函数名称。(例如它的作用)

推荐阅读