【问题标题】:copy the object.keys to new object将 object.keys 复制到新对象
【发布时间】:2018-11-11 09:59:10
【问题描述】:

如何将一个或所有 Object.keys 复制到新的对象字面量 示例:

  let obj = [
    {
      name: "value1",
      age: "value2",
      gender: "value3",
      group: "cat"
    },
    {
      name: "value1",
      age: "value2",
      gender: "value3",
      group: "cat"
    },
    {
      name: "value1",
      age: "value2",
      gender: "value3",
      group: "dog"
    },
    {
      name: "value1",
      age: "value2",
      gender: "value3",
      group: "dog"
    },

    ]

输出是这样的:

{ 
cat: { name: "value1", age: "value2"},
dog: { name: "value1", age: "value2"}
}

我们是否应该让临时对象复制它,然后将其分配给 newObj? 我确实想知道解释,所以我会理解它, 这只是一个例子,如果组有很多种类的组,我们应该为此创建一个函数,对吗?

【问题讨论】:

    标签: javascript arrays json object for-loop


    【解决方案1】:

    您可以遍历数组中的每个项目,处理数据,并将结果分配给一个新对象:

    let array_of_objects = [{
        name: "value1",
        age: "value2",
        gender: "value3",
        group: "cat"
      },
      {
        name: "value1",
        age: "value2",
        gender: "value3",
        group: "cat"
      },
      {
        name: "value1",
        age: "value2",
        gender: "value3",
        group: "dog"
      },
      {
        name: "value1",
        age: "value2",
        gender: "value3",
        group: "dog"
      },
    
    ]
    
    let result = {};
    
    array_of_objects.forEach(animal =>
      result[animal.group] = {
          name: animal.name,
          age: animal.age
        }
      );
    
    console.log(result);

    解释:

    1. 我们创建一个结果对象,它将以所需格式收集数据。
    2. forEach 方法允许我们循环遍历数组。在每个循环中,都会调用一个元素 animal
    3. 然后对象result 接收到它以前的值,这要归功于扩展符号...result 加上新的键,这要归功于代码的[animal.group] 部分。请注意,此符号位于方格之间,因为需要对键进行评估。

    注意:使用此实现,新的 cat 值将例如覆盖以前的值,但是当您的数据集中有两个 cat 时,您的问题并不完全清楚您想要做什么。

    【讨论】:

    • 我们不能使用扩展语法吗?我想知道现在使用扩展语法@PierreCapo
    【解决方案2】:

    您可以使用Object.assign(众多替代方案之一):

    const array_of_objects = [{ name: "value1", age: "value2", gender: "value3", group: "cat" }, { name: "value1", age: "value2", gender: "value3", group: "cat" }, { name: "value1", age: "value2", gender: "value3", group: "dog" }, { name: "value1", age: "value2", gender: "value3", group: "dog" }, ];
    
    const result = {};
    for (const obj of array_of_objects) result[obj.group] = Object.assign({}, obj);
    
    console.log(result);

    Object.assign 将评估作为第二个(第三个,...)参数给出的对象的(可枚举)属性,并将这些属性存储在作为第一个参数传递的对象中。结果对象被返回,因此代表一个(浅)副本。

    使用更现代的传播语法也可以达到同样的效果。

    如果您只想复制 一些 特定属性,而不是全部,那么您可以对每个键使用简单的分配。这并不是一个真正具有挑战性的答案,我想你在循环体中写下以下内容没有问题:

    const copy = {};
    copy.name = obj.name;
    // copy anything else here ...
    result[obj.group] = copy; // store it in the overall result object
    

    如果你想要更酷的东西,那么我们回到 ES6 语法:

    const {name, age} = obj;
    result[obj.group] = {name, age};
    

    【讨论】:

    • 谢谢你,帅先生 :D,如果我们只需要 Object.assign 的名字和年龄呢? @trincot
    • 好吧,那么您就不用Object.assign,而只需将值分配给您想要的键。这很简单,对吧?但是,如果您想要一个不知道对象键的通用解决方案,那么Object.assign 会很有帮助。
    【解决方案3】:

    您可以使用Array#reduce() 和对象解构相当轻松地做到这一点

    const res = data.reduce((a, {group, gender, ...rest})=>{
       a[group] = {...rest}
       return a
    },{})
        
    console.log(res)
    <script>
      const data = [{
          name: "value1",
          age: "value2",
          gender: "value3",
          group: "cat"
        },
        {
          name: "value1",
          age: "value2",
          gender: "value3",
          group: "cat"
        },
        {
          name: "value1",
          age: "value2",
          gender: "value3",
          group: "dog"
        },
        {
          name: "value1",
          age: "value2",
          gender: "value3",
          group: "dog"
        },
    
      ]
    </script>

    【讨论】:

    • 如果不使用reduce而不是展开语法呢? @charlietfl
    • 这是一种使用你想要的字段数组的方法 jsfiddle.net/sjg3qhba 不使用任何 ES6 特性
    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2015-01-30
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多