Es6 спосіб перетворення значення об'єкта в один об'єкт

Я хочу конвертувати всі дані в один об'єкт,

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",
}

i tried some methods of Object like keys , entries but dont no what to use. Final output should be

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

1

5 Відповіді

Reduce the entries of the original object. If the entry's value is an array merge the 1st element, if not merge the original key and value. You can merge the properties into the object using object spread:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

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);
</div> </div>

7
додано

Ви можете скористатися Array.reduce і Object.entries

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

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);
</div> </div>

2
додано

Можна взяти рекурсивний підхід.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

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; }
</div> </div>

2
додано
... Object.assign (... v.map (fn)) ... викличе свою ліву за допомогою fn .
додано Автор Nina Scholz, джерело
О мій поганий. Не бачив цього. Досить елегантний.
додано Автор Aluan Haddad, джерело

Можливим ітераційним рішенням є:

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;
}
1
додано

Щось на зразок цього:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

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));
</div> </div>

0
додано
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram