【问题标题】:Transform javascript object转换 javascript 对象
【发布时间】:2019-04-06 10:02:57
【问题描述】:

JavaScript 对象的这种简单(我认为和以前一样)转换让我失望。我想通过以下方式展平这个对象。

这就是我所拥有的:

{
    "1": {
        "group": "Clothes",
        "brand": {
            "0": {
                "brand_id": "12",
                "brand_name": "Adidas"
            },
            "1": {
                "brand_id": "15",
                "brand_name": "Zara"
            }
        }
    },
    "2": {
        "group": "Cars",
        "brand": {
            "0": {
                "brand_id": "43",
                "brand_name": "Ferrari"
            },
            "1": {
                "brand_id": "51",
                "brand_name": "BMW"
            }
        }
    }
}

这就是我想要的东西

{0: {
    brand_id: "12",
    brand_name: "Adidas",
    group: "Clothes",
}
1: {
    brand_id: "15",
    brand_name: "Zara",
    group: "Clothes",
},
2: {
    brand_id: "43",
    brand_name: "Ferrari",
    group: "Cars",
}
3: {
    brand_id: "51",
    brand_name: "BMW",
    group: "Cars",
}}

我尝试使用.reduce().map(),但效果不佳。

【问题讨论】:

  • 发布的问题似乎根本没有包含any attempt 来解决问题。 StackOverflow 期待您 try to solve your own problem first,因为您的尝试有助于我们更好地了解您想要什么。请编辑问题以显示您尝试过的内容,以说明您在minimal reproducible example 中遇到的特定问题。欲了解更多信息,请参阅How to Ask 并拨打tour
  • 看起来您已经从某处的调试器中复制了数据,您可能想澄清那里的对象/数组结构。您在第一个块中拥有的不是有效的 JSON(或 hjavascript)。
  • 对象数据不正确..请更正

标签: javascript arrays typescript for-loop filter


【解决方案1】:

你可以这样做:

const data = {1: {group: 'Clothes',brand: [{0: {brand_id: '12',brand_name: 'Adidas'}},{1: {brand_id: '15',brand_name: 'Zara'}}]},2: {group: 'Cars',brand: [{0: {brand_id: '43',brand_name: 'Ferrari'}},{1: {brand_id: '51',brand_name: 'BMW'}}]}};
const result = {};

Object.keys(data).forEach(k => {
  data[k].brand.forEach((b, i) => {
    result[Object.keys(result).length] = {
      brand_id: b[i].brand_id,
      brand_name: b[i].brand_name,
      group: data[k].group
    };
  });
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    这个对象有点像array-like objects,但索引从1开始而不是0,并且缺少length

    先修正一些错字,brand 应该是 object 而不是 array

    var objectOri = {
        1: {
            group: 'Clothes',
            brand: {
                0: {
                    brand_id: "12",
                    brand_name: "Adidas"
                },
                1: {
                    brand_id: "15",
                    brand_name: "Zara"
                }
            }
        },
        2: {
            group: 'Cars',
            brand: {
                0: {
                    brand_id: "43",
                    brand_name: "Ferrari"
                },
                1: {
                    brand_id: "51",
                    brand_name: "BMW"
                }
            }
        }
    };
    
    let arr = [];
    Object.keys(objectOri).forEach(index => {
        let brand = objectOri[index].brand;
        Object.keys(brand).forEach(brIndex => {
            arr.push({
                ...brand[brIndex],
                group: objectOri[index].group
            });
        });
    });
    
    
    console.log(Object.assign({}, arr))
    
     

    另外,如果这个对象是array-like object,key 应该从 0 开始而不是 1,长度也是必需的,如下所示。

    var objectOri = {
        0: {
            group: 'Clothes',
            brand: {
                0: {
                    brand_id: "12",
                    brand_name: "Adidas"
                },
                1: {
                    brand_id: "15",
                    brand_name: "Zara"
                },
                length: 2
            }
        },
        1: {
            group: 'Cars',
            brand: {
                0: {
                    brand_id: "43",
                    brand_name: "Ferrari"
                },
                1: {
                    brand_id: "51",
                    brand_name: "BMW"
                },
                length: 2
            }
        },
        length: 2
    };
    
    let arr = [];
    Array.from(objectOri).forEach(item => {
        Array.from(item.brand).forEach(brand => {
            arr.push({
                ...brand,
                group: item.group
            });
        });
    });
    
    
    console.log(Object.assign({}, arr))
    
     

    【讨论】:

      【解决方案3】:

      let input = { "1": { "group": "Clothes", "brand": { "0": { "brand_id": "12", "brand_name": "Adidas"}, "1": { "brand_id": "15",                    "brand_name": "Zara"}} },
                    "2": { "group": "Cars", "brand": { "0": { "brand_id": "43","brand_name": "Ferrari"},                "1": { "brand_id": "51", "brand_name": "BMW"}}}}
      
      output = {}
      Object.values(input).forEach(({ group, brand })=> {
        Object.values(brand).forEach(({ brand_id, brand_name })=>{      
          output[Object.keys(output).length]= {
            brand_id,
            brand_name,
            group,
          }
        })
      })
      
      console.log(output)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-13
        • 2022-01-10
        • 1970-01-01
        • 2015-08-09
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多