【问题标题】:How do I merge two downloaded arrays into a single JSON array?如何将两个下载的数组合并为一个 JSON 数组?
【发布时间】:2020-06-16 00:48:13
【问题描述】:

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

基本上,我通过 request-promise 从两个不同的帐户下载 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

【问题讨论】:

  • how do i get my data into a variable outside of rp? 全局声明变量
  • 请您在合并 json 对象的地方添加代码 sn-p 吗?
  • 您从哪里获得 first_account_name 和 second_account_name 数据?那么在里面还是外面?

标签: javascript arrays node.js json request-promise


【解决方案1】:

如果你使用的是 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,因为我不知道正在处理什么。我建议您更具体地了解函数名称。 (例如它的作用)

【讨论】:

    【解决方案2】:

    您正在寻找的是一个全局数组,该数组在每次调用正确的 Promise 请求时都会将数据推送到其中。因此,首先,创建一个简单的数组并将其放在页面顶部,或者如果您使用的是类,只需将其插入相应的字段中。

    Let accountDetails = [];
    

    接下来,在then函数里面这样调用这个变量,

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

    【讨论】:

      猜你喜欢
      • 2012-05-10
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多