【问题标题】:Combining 2 objects through a loop通过循环组合 2 个对象
【发布时间】:2021-07-06 20:21:52
【问题描述】:
let response = {
    data1: {
       names: ["John", "jim"]
    },
    data2: {
       ages: [34, 24]
    }
}

我想要:

data: {
   names: ["John", "jim"],
   ages: [34,24]
}

有没有办法在不引用response.data1response.data2 的情况下将它们合并为一个对象?我知道我可以做到 const newObj = {...response.data1, ...response.data2}Object.assign({}, response.data1, response.data1)... 我可以通过 for in 循环做到吗?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您可以像这样使用Object.assign() 合并对象的值:

    Object.assign({}, ...Object.values(response))
    

    解释:

    这是 Object.assign 的语法:Object.assign(target, source1, source2, ... etc)。它基本上从 source 对象中获取所有属性并更新 target 对象

    Object.values() 位返回response 对象的值。在这种情况下,它是一个对象数组,如下所示:

    [
      { names: ["John", "jim"] }, 
      { ages: [34, 24] }
    ]
    

    您可以spread 数组并将单个对象作为参数传递给Object.assign()

    这是一个sn-p:

    let response = {
      data1: {
        names: ["John", "jim"]
      },
      data2: {
        ages: [34, 24]
      }
    }
    
    const output = Object.assign({}, ...Object.values(response))
    
    console.log(output)

    如果太混乱你可以使用reduce:

    Object.values(response)
          .reduce((a, v) => ({ ...a, ...v }), {})
    

    或者一个简单的循环:

    const output = {}
    
    for(const key in response)
      Object.assign(output, response[key])
    

    【讨论】:

    • 我相信这个问题表明他们知道Object.assign 解决方案,但他们特别想尝试通过循环来完成它。
    • @AlexanderNied 这不是他们的意思。他们说他们不想明确使用属性名称data1,因为它是动态的,并且可能存在未知数量的属性。
    • 啊当然,这很公平;这可能是正确的解释。
    • @AlexanderNied 他们说他们知道 an Object.assign 解决方案。没有像 Object.assign 解决方案这样的东西。
    【解决方案2】:

    如果您想使用for in 循环合并data1data2,试试这个:

    let response = {
        data1: {
           names: ["John", "jim"]
        },
        data2: {
           ages: [34, 24]
        }
    }
    var result = {}
    for (data in response) {
      if (response.hasOwnProperty(data)) {
        [key] = Object.keys(response[data])
        result[key] = response[data][key]
      }
    }
    console.log(result)

    它的工作方式是获取datadata2的键,然后使用这些键,获取值并将其添加到result

    【讨论】:

    • 可能值得注意的是,因为for...in 循环会遍历对象的所有 属性,包括继承的属性,所以通常需要在继续之前包含.hasOwnProperty() check任何处理。
    • 我修好了,是不是更好?
    猜你喜欢
    • 2011-10-03
    • 2019-09-28
    • 1970-01-01
    • 2021-06-04
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    相关资源
    最近更新 更多