Javascript映射嵌套数组

Javascript映射嵌套数组,javascript,react-native,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" "rat

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

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,但我无法破坏“rates”

这就是我尝试过的

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

  return {
        date,
        rate: data.rates

  }
  })
 };
我必须“双重映射”数据才能得到我想要的吗?

有很多方法(像往常一样)比如使用
map
reduce
,或者简单的方法是循环
rates
条目并用你想要的结构重新创建另一个对象

它应该是这样的:

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,
        };
    });
})
const obj={
“费率”:{
"2019-09-04": {
“美元”:0.1275393858,
},
"2019-09-05": {
“美元”:0.1275638511,
} 
}
}
const transformedObj={rates:{}
设i=0
for(让对象项的[键,值](对象比率)){
transformedObj.rates[i++]={
日期:,
速率:对象值(值)[0],
货币:对象。键(值)[0]
}
}
console.log(transformedObj)
双映射可能不够。虽然这个想法是正确的,但您的问题包括两次“获取对象的属性”,同时也为其指定正确的值

使用两个贴图的解决方案可能如下所示:

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,
},
仅此一步就可以生成一个包含两个元素的数组。相互速率可以在它们自己的数组中生成动态数量的对象

您需要展平该阵列。唉,这并没有得到广泛的支持

所以你最好使用像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"
    }
]

仅供参考,您的任何示例中都没有数组。也许你指的是嵌套对象?结果如何比输入“更平坦”?你只是用一个数字来代替日期。这不会改变对象的深度抱歉,我对编码还不熟悉。如果我想做像“rates”:{“2019-09-04”:{“date”:“2019-09-04”,“rate”:0.1275393858,“currency”:“USD”},我会搞乱嵌套对象和嵌套数组hello,没有增量数字,我该怎么做?这对有多种货币的利率有效吗?@k0pernikus我不想为某些假设编写代码。所以答案是否定的@Rachells我已经为你的第二个请求更新了…请检查这是否是你想要的。这是一个很好的例子谢谢你,我从你的代码和经验中学到了很多赖恩!