【问题标题】:Es6 way to convert object key value to one single objectes6将对象键值转换为单个对象的方法
【发布时间】:2019-03-05 09:13:27
【问题描述】:

我想把所有数据都转换成一个对象,

let d = {
  "Coupon_Code": "code",
  "Coupon_Name": "namie",
  "Coupon_Desc": 1000,
  "selectedCity": [
    {
      "Coupon_City_Name": "xyz"
    }
  ],
  "selectedCategory": [
    {
      "Coupon_Category_Name": "Shopping"
    }
  ],
  "selectedCompany": [
    {
      "Coupon_Company_Name": "Shopper Stop"
    }
  ],
  "selectedState": [
    {
      "Coupon_State_Name": "abc"
    }
  ],
  "Coupon_Date": "2222-02-22",
}

我尝试了一些 Object 的方法,例如 keys , entries 但不知道该使用什么。 最终输出应该是

let d = {
  Coupon_Code: "code",
  Coupon_Name: "namie",
  Coupon_Desc: 1000,
  Coupon_City_Name: "xyz",
  Coupon_Category_Name: "Shopping",
  Coupon_Company_Name: "Shopper Stop",
  Coupon_State_Name: "abc",
  Coupon_Date: "2222-02-22",
};

使用 Venila Js 和 Es6 获得上述结果的最佳和最佳方式是什么

【问题讨论】:

    标签: javascript arrays json ecmascript-6


    【解决方案1】:

    Reduce 原始对象的entries。如果条目的值是一个数组,则合并第一个元素,如果不是,则合并原始键和值。您可以使用object spread 将属性合并到对象中:

    const data = {"Coupon_Code":"code","Coupon_Name":"namie","Coupon_Desc":1000,"selectedCity":[{"Coupon_City_Name":"xyz"}],"selectedCategory":[{"Coupon_Category_Name":"Shopping"}],"selectedCompany":[{"Coupon_Company_Name":"Shopper Stop"}],"selectedState":[{"Coupon_State_Name":"abc"}],"Coupon_Date":"2222-02-22"};
    
    const result = Object.entries(data)
      .reduce((r, [k, v]) => ({
        ...r,
        ...Array.isArray(v) ? v[0] : { [k]: v }
      }), {});
    
    console.log(result);

    【讨论】:

      【解决方案2】:

      您可以使用Array.reduce 和Object.entries

      let d = {"Coupon_Code":"code","Coupon_Name":"namie","Coupon_Desc":1000,"selectedCity":[{"Coupon_City_Name":"xyz"}],"selectedCategory":[{"Coupon_Category_Name":"Shopping"}],"selectedCompany":[{"Coupon_Company_Name":"Shopper Stop"}],"selectedState":[{"Coupon_State_Name":"abc"}],"Coupon_Date":"2222-02-22"};
      
      d = Object.entries(d).reduce((a,[k,v]) => {
        // If the value is an array, iterate over it to merge into the resultant object
        if(Array.isArray(v)) Object.assign(a, ...v)
        else Object.assign(a, {[k]:v}) // if it is not an array, merge into resultant object
        return a;
      }, {});
      console.log(d);

      【讨论】:

        【解决方案3】:

        一个可能的迭代解决方案是:

        function flatten(obj) {
            let r = {}
            for (let [key, value] of Object.entries(obj)) {
                if (Array.isArray(value)) {
                    Object.assign(r, value[0]);
                } else {
                    Object.assign(r, {[key]: value});
                }
            }
            return r;
        }
        

        【讨论】:

          【解决方案4】:

          您可以采用递归方法。

          const
              fn = o => Object.assign(...Object.entries(o).map(([k, v]) => Array.isArray(v) ? Object.assign(...v.map(fn)) : { [k]: v })),
              d = { Coupon_Code: "code", Coupon_Name: "namie", Coupon_Desc: 1000, selectedCity: [{ Coupon_City_Name: "xyz" }], selectedCategory: [{ Coupon_Category_Name: "Shopping" }], selectedCompany: [{ Coupon_Company_Name: "Shopper Stop" }], selectedState: [{ Coupon_State_Name: "abc" }], Coupon_Date: "2222-02-22" },
              result = fn(d);
          
          console.log(result);
          .as-console-wrapper { max-height: 100% !important; top: 0; }

          【讨论】:

          • ... Object.assign(...v.map(fn)) ... 用fn 调用自己。
          • 哦,我的错。没看到那个。相当优雅。
          【解决方案5】:

          类似这样的:

          const d = { Coupon_Code: "code", Coupon_Name: "namie", Coupon_Desc: 1000, selectedCity: [{ Coupon_City_Name: "xyz" }], selectedCategory: [{ Coupon_Category_Name: "Shopping" }], selectedCompany: [{ Coupon_Company_Name: "Shopper Stop" }], selectedState: [{ Coupon_State_Name: "abc" }], Coupon_Date: "2222-02-22" };
          
          function toSingleObj(obj) {
              var result = {};
              Object.entries(obj).forEach(([key,value]) => {
                  if (Array.isArray(value)) {
                      Object.entries(value[0]).forEach(([k,v]) => {
                          result[k] = v;
                      });
                  } else {
                      result[key] = value;
                  }
              });
              return result;    
          }
          
          
          console.log("Result: ", toSingleObj(d));

          【讨论】:

            猜你喜欢
            • 2018-01-06
            • 2022-08-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多