Javascript映射嵌套数组

时间:2019-09-10 16:14:33

标签: javascript react-native

我有一个嵌套的对象数组,例如:

const data = {
  "rates": {
    "2019-09-04": {
      "USD": 0.1275393858,
    },
    "2019-09-05": {
      "USD": 0.1275638511,
},   "2019-09-06": {
      ...
}

我想要做的就是将数组弄平,然后将结果返回为:

"rates": {
   1:{
    "date": "2019-09-04"
    "rate": "0.1275393858",
    "currency":"USD"
    },
  } 2:{ ...

我尝试过Object.key,但是我无法破坏“费率”。

这是我尝试过的。

const newData = {
rates: Object.keys(data.rates).map((date, idx) => {

  return {
        date,
        rate: data.rates

  }
  })
 };

我是否必须对数据进行“双重映射”才能得到我想要的?

2 个答案:

答案 0 :(得分:1)

有很多方法(像往常一样),例如,使用mapreduce或简单的方法是遍历rates条目并使用所需的结构重新创建另一个对象。

它应该看起来像这样:

const obj = {
  "rates": {
    "2019-09-04": {
      "USD": 0.1275393858,
    },
    "2019-09-05": {
      "USD": 0.1275638511,
    } 
  }
}


const transformedObj = {rates: {}}
let i = 0
for (let [key, value] of Object.entries(obj.rates)) {
    transformedObj.rates[i++] = {
      date: key, 
      rate: Object.values(value)[0],
      currency: Object.keys(value)[0]
    }
}

console.log(transformedObj)

更新

如果您不想使用索引,请执行以下操作:

const obj = {
  "rates": {
    "2019-09-04": {
      "USD": 0.1275393858,
    },
    "2019-09-05": {
      "USD": 0.1275638511,
    } 
  }
}


const transformedObj = {rates: {}}

for (let [key, value] of Object.entries(obj.rates)) {
    transformedObj.rates[key] = {
      date: key, 
      rate: Object.values(value)[0],
      currency: Object.keys(value)[0]
    }
}

console.log(transformedObj)

答案 1 :(得分:0)

“双重地图”可能还不够。尽管这个想法是正确的,但是您的问题在于两次“获取对象的属性”,同时还为其分配了正确的值。

使用两个地图的解决方案如下所示:

const dates = Object.keys(data.rates);
const results = dates.map((date) => {
    const currencies = Object.keys(data.rates[date]);
    return currencies.map(currency => {
        return {
            date: date,
            rate: data.rates[date][currency],
            currency: currency,
        };
    });
})

尽管这将是一个数组数组!如果您假设您的汇率采用两种货币,则这很有意义:

"2019-09-04": {
    "USD": 0.1275393858,
    "EUR": 1.47455,
},

仅此一项就产生一个包含两个元素的数组。彼此的比率可能会在其自己的数组中生成动态数量的对象。

您需要展平该数组数组。 las,Array.prototype.flatArray.prototype.flatMap不受广泛支持。

因此,最好使用lodash之类的库。

因此,您可以通过以下方式得到想要的结果:

_.flatten(results), null, 4)

Lodash也支持flatMap,那么解决方案可以这样写:

import * as _ from "lodash";

const data = {
    "rates": {
        "2019-09-04": {
            "USD": 0.1275393858,
            "EUR": 1.47455,
        },
        "2019-09-05": {
            "USD": 0.1275638511,
        },
    },
};

const dates = Object.keys(data.rates);
const results = _.flatMap(dates, (date) => {
    const currencies = Object.keys(data.rates[date]);
    return currencies.map(currency => {
        return {
            date: date,
            rate: data.rates[date][currency],
            currency: currency,
        };
    });
});

console.log(JSON.stringify(results, null, 4));

将打印:

[
    {
        "date": "2019-09-04",
        "rate": 0.1275393858,
        "currency": "USD"
    },
    {
        "date": "2019-09-04",
        "rate": 1.47455,
        "currency": "EUR"
    },
    {
        "date": "2019-09-05",
        "rate": 0.1275638511,
        "currency": "USD"
    }
]