【问题标题】:Make an array of objects inside object as multiple objects JavaScript将对象内的对象数组作为多个对象 JavaScript
【发布时间】:2021-05-12 09:21:39
【问题描述】:

我需要在父对象内的多个对象中转换一个对象数组:

实物:

{
name: 'John Doe',
Age: 50,
email: 'j@gmail.com'
wishlist: [
   {product1 : 1},
   {product2 : 3},
   {product3 : 5},
   {product4 : 2},
 ]
}

目标:

{

name: 'John Doe',
Age: 50,
email: 'j@gmail.com',
product1 : 1,
product2 : 3,
product3 : 5,
product4 : 2,

}

有人知道怎么做吗? 亲切的问候,

【问题讨论】:

  • 愿望清单对象(例如{product1 : 1})会不会有多个条目?
  • 我想要一些相反的东西。有人可以帮我吗?

标签: javascript arrays object arrayobject


【解决方案1】:

在愿望清单数组上使用reduce() 方法,然后使用spread 运算符创建最终对象。

const myObj = {
name: 'John Doe',
Age: 50,
email: 'j@gmail.com',
wishlist: [
   {product1 : 1},
   {product2 : 3},
   {product3 : 5},
   {product4 : 2},
 ]
}

const processData = (data) => {
  const wishlist = data.wishlist.reduce((result, obj) => {
     return {...result, ...obj};
  }, {});
  const finalObj = {...data, ...wishlist};
  delete finalObj.wishlist;
  return finalObj;
}

console.log(processData(myObj));

【讨论】:

    【解决方案2】:

    您可以合并所有产品,然后将它们与对象合并,然后删除初始数组。我认为这种方式更好,不要在迭代其属性之一时修改原始对象。

    let products = {} 
    for (let product of obj.wishlist)
       products = {...products, ...product}
    obj = {...obj, ...products}
    delete obj.wishlist
    

    【讨论】:

      【解决方案3】:

      您可以使用destructuring 来获取您的wishlist 数组和一个不包括您的whishlist 数组(存储在r 中)的属性对象,然后您可以使用Object.assign()spread syntax 来合并所有将愿望清单数组中的对象放入您的 r 对象中:

      const {wishlist, ...r} = { name: 'John Doe', Age: 50, email: 'j@gmail.com', wishlist: [ {product1 : 1}, {product2 : 3}, {product3 : 5}, {product4 : 2}, ] };
      
      const res = Object.assign(r, ...wishlist);
      console.log(res);

      【讨论】:

        【解决方案4】:

        你可以试试这个,

        var obj = {
          name: 'John Doe',
          Age: 50,
          email: 'j@gmail.com',
          wishlist: [{ product1: 1 }, { product2: 3 }, { product3: 5 }, { product4: 2 }]
        };
        
        var newObj = Object.assign({}, ...obj.wishlist);
        delete obj.wishlist;
        
        const finalObj = { ...obj, ...newObj };
        console.log(finalObj);
        

        【讨论】:

        • 你不能删除原始obj的wishlist属性。
        • @RahulKumar 你说不能是什么意思?此代码似乎有效。该问题没有提及有关不修改原始对象的任何内容。你的意思是最好不要这样做吗?还是我缺少什么?
        • 建议不要修改原始对象,同时遵循最佳编码实践。在他的代码中,该对象可能会在其他地方使用,这可能会导致问题。
        【解决方案5】:

        如果有人在寻找更通用的答案。

        我编写了代码来在另一个对象或数组中转换一个对象或数组。

        如果你问我,那就有点矫枉过正了。

        const sample = [{
          name: 'John Doe',
          Age: 50,
          email: 'j@gmail.com',
          wishlist: [{ product1: 1 }, { product2: 3 }, { product3: 5 }, { product4: 2 }]
        }];
        
        const transformArray = array => {
            let obj = {};
            array.forEach(item => {
                if (Array.isArray(item)) {
                    obj = { ...obj, ...transformArray(item)};
                } else if (typeof item == 'object') {
                    obj = { ...obj, ...transformObj(item)};
                }
            });
            return obj;
        }
        
        const transformObj = object => {
            let obj = {};
            Object.keys(object).forEach(key => {
                const item = object[key];
                if (Array.isArray(item)) {
                    obj = { ...obj, ...transformArray(item) };
                } else if (typeof item == 'object') {
                    obj = { ...obj, ...transformObj(item) };
                } else {
                    obj = { ...obj, [key]: item };
                }
            });
            return obj;
        }
        
        console.log(transformObj(sample));

        【讨论】:

          猜你喜欢
          • 2017-01-14
          • 1970-01-01
          • 2020-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-10
          • 1970-01-01
          • 2019-10-22
          相关资源
          最近更新 更多