【问题标题】:Merge multiple arrays in object合并对象中的多个数组
【发布时间】:2018-12-03 05:26:19
【问题描述】:

我正在寻找一种将多个数组道具合并到一个对象中的有效方法。

对象,可以有多个数组属性:

{
  "col0Codes": [
    "ABC",
    "XYZ",
    "UYA",
    "ZZA",
    "AAW",
    "MYP"
  ],
  "col1Codes": [
    "CNA",
    "ZYA",
    "OIA",
    "POQ",
    "LMO",
    "OPI"
  ],
  "col2Codes": [
    "CNA",
    "ZYA",
    "OIA",
    "POQ",
    "LMO",
    "OPI"
  ],
  "col3Codes": [
    "..."
  ],
  "col4Codes": [
    "..."
  ],
  ...
}

结果:单个数组中的所有代码

["ABC","XYZ","UYA","ZZA","AAW","MYP","CNA","ZYA","OIA","POQ","LMO","OPI",....]

我尝试过使用concat,但这每次都会创建一个新数组并覆盖前一个数组,我觉得这不是快速和内存效率。

let colCodes = []
 for (let i in data) {
 colCodes = colCodes .concat(i)
}
console.log(activityCodes)

我尝试过使用push,但由于某种原因,它不会将所有条目合并到一个数组中,而是创建一个数组,其中包含对象中的道具数量,如下所示

let colCodes = []
  for (let i in data) {
  colCodes.push(i)
}
console.log(colCodes)
[Array(6), Array(5), ....]

无论如何我可以使用reduce 来实现这一点,如果那样的话会快速且内存效率高?

【问题讨论】:

标签: javascript arrays


【解决方案1】:

您可以使用Object.values() 获取数组数组,然后使用Array.flat() 将它们展平为单个数组:

const data = {"col0Codes":["ABC","XYZ","UYA","ZZA","AAW","MYP"],"col1Codes":["CNA","ZYA","OIA","POQ","LMO","OPI"],"col2Codes":["CNA","ZYA","OIA","POQ","LMO","OPI"]};

const result = Object.values(data).flat();

console.log(result);

旧答案:

你可以得到Object.values(),然后通过spreading合并成Array.concat()

const data = {"col0Codes":["ABC","XYZ","UYA","ZZA","AAW","MYP"],"col1Codes":["CNA","ZYA","OIA","POQ","LMO","OPI"],"col2Codes":["CNA","ZYA","OIA","POQ","LMO","OPI"]};

const result = [].concat(...Object.values(data));

console.log(result);

【讨论】:

    【解决方案2】:

    你也可以简单地 Array.reduce Object.values 与 ES6 传播:

    const input={"col0Codes":["ABC","XYZ","UYA","ZZA","AAW","MYP"],"col1Codes":["CNA","ZYA","OIA","POQ","LMO","OPI"],"col2Codes":["CNA","ZYA","OIA","POQ","LMO","OPI"]};
    
    console.log(Object.values(input).reduce((r,c) => [...r, ...c]))

    【讨论】:

    • 投了赞成票。感谢您的回答,只是想弄清楚语法发生了什么,必须深入研究以了解您的代码如何使对象变平。
    • @SubSul 在reduce回调(r,c) => [...r, ...c])中,r代表累加器,c是当前被迭代的数组元素。那么这个回调的返回值([...r, ...c])简单来说就是这个数组的内容包含了r的元素和c的元素。
    • @SubSul 或者你可以简单地这样做:Object.values(input).reduce((r,c) => r.concat(c), [])
    • @achacttn 和 robe007 -> 谢谢你们的解释。
    【解决方案3】:

    一种方法是使用Array.prototype.flat,并在对象的值上调用它:

    const input={"col0Codes":["ABC","XYZ","UYA","ZZA","AAW","MYP"],"col1Codes":["CNA","ZYA","OIA","POQ","LMO","OPI"],"col2Codes":["CNA","ZYA","OIA","POQ","LMO","OPI"]};
    
    console.log(
      Object.values(input).flat()
    );

    【讨论】:

    • 警告: .flat 是一项新功能。如果 sn-p 抛出错误,很可能是你没有最新的浏览器。
    • 投了赞成票。感谢您的回答,但我也需要在 IE 上工作。还是谢谢。
    【解决方案4】:

    你可以试试这个

    let obj = {"col0Codes": ["ABC","XYZ","UYA","ZZA","AAW","MYP"],
      "col1Codes": ["CNA","ZYA","OIA","POQ","LMO","OPI"],
      "col2Codes": ["CNA","ZYA","OIA","POQ","LMO","OPI"],
      "col3Codes": ["..."],
      "col4Codes": ["..."]
    }
    
    let op = [];
    
    for(let key in obj){
      op.push(...obj[key])
    }
    
    console.log(op)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-08
      • 2017-02-06
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      相关资源
      最近更新 更多