代码之家  ›  专栏  ›  技术社区  ›  Francesco G.

用另一个对象填充javascript对象

  •  0
  • Francesco G.  · 技术社区  · 12 月前

    我有一个这样的javascript对象

    const allData = {
      "aaa": {
        "xxx": {},
        "details": {
          "111": {
            "a": 1
          }
        }
      },
      "bbb": {
        "yyy": {},
        "details": {
          "222": {
            "a": 10
          }
        }
      },
      "ccc": {
        "zzz": {},
        "details": {
          "333": {
            "a": 100
          }
        }
      },
      "ddd": {
        "kkk": {},
        "details": {
          "444": {
            "a": 1000
          }
        }
      }
    };
    

    我喜欢把所有细节都交给另一个,所以:

    allDetails={};
    $.each(allData, function (nameCont, valCont){
      console.dir(valCont.details);
      Object.defineProperty(allDetails, nameCont, valCont.details);
    });
    console.dir(allDetails);
    

    我预计结果应该是:

    {
      "aaa": {
        "111": {
          "a": 1
        }
      },
      "bbb": {
        "222": {
          "a": 10
        }
      },
      "ccc": {
        "333": {
          "a": 100
        }
      },
      "ddd": {
        "444": {
          "a": 1000
        }
      }
    }
    

    但它不起作用……怎么了?

    在这里 fiddle

    3 回复  |  直到 12 月前
        1
  •  1
  •   fdomn-m    12 月前

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

    参数
    obj :定义属性的对象。
    prop :指定要定义或修改的属性键的字符串或符号。
    descriptor :正在定义或修改的属性的描述符。

    您对此的呼吁:

    Object.defineProperty(allDetails, nameCont, valCont.details);
    

    传递一个值作为 描述符 ,不是a 描述符 ,应该是:

    Object.defineProperty(allDetails, nameCont, { value: valCont.details });
    

    更新小提琴: https://jsfiddle.net/th1ves6q/

    allData={
      "aaa":{
        "xxx":{},
        "details":{
          "111":{
            "a":1
          }
        }
      },
      "bbb":{
        "yyy":{},
        "details":{
          "222":{
            "a":10
          }
        }
      },
      "ccc":{
        "zzz":{},
        "details":{
          "333":{
            "a":100
          }
        }
      },
      "ddd":{
        "kkk":{},
        "details":{
          "444":{
            "a":1000
          }
        }
      }
    };
    allDetails={};
    $.each(allData, function (nameCont, valCont){
      //console.dir(valCont.details);
      Object.defineProperty(allDetails, nameCont, { value: valCont.details });
    });
    
    console.dir(allDetails);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    
    View result in browser console
        2
  •  0
  •   Roko C. Buljan    12 月前

    const allData = {
      "aaa": {"xxx": {}, "details": { "111": { "a": 1 }}},
      "bbb": {"yyy": {}, "details": { "222": { "a": 10 }}},
      "ccc": {"zzz": {}, "details": { "333": { "a": 100 }}},
      "ddd": {"kkk": {}, "details": { "444": { "a": 1000 }}}
    };
    
    const result = Object.entries(structuredClone(allData)).reduce((acc, [k,v]) => {
      acc[k] = v.details;
      return acc;
    }, {});
    
    console.log(result);
    // {"aaa":{"111":{"a":1}}, "bbb":{"222":{"a":10}}, "ccc":{"333":{"a":100}}, "ddd":{"444":{"a":1000}}};
        3
  •  0
  •   dale landry    12 月前

    嵌套 for of 使用 Object.entries 在第一个循环中,获取第一个键并将其值记录到创建空对象的结果中,然后在第二个循环中获取 value.details 键/值并将其记录到结果中。

    const allData = {
      "aaa": {
        "xxx": {},
        "details": {
          "111": {
            "a": 1
          }
        }
      },
      "bbb": {
        "yyy": {},
        "details": {
          "222": {
            "a": 10
          }
        }
      },
      "ccc": {
        "zzz": {},
        "details": {
          "333": {
            "a": 100
          }
        }
      },
      "ddd": {
        "kkk": {},
        "details": {
          "444": {
            "a": 1000
          }
        }
      }
    };
    
    const allDetails = (obj) => {
      let result = {}
      for (let [k, v] of Object.entries(obj)) {
        result[k] = {}
        for (let [key, val] of Object.entries(v.details)) {
          result[k][key] = val
        }
      }
      return result;
    };
    
    console.log(allDetails(allData));
        4
  •  -2
  •   Alex    12 月前

    使用。。。扩展语法

    const allDetails = {...allData}