【问题标题】:Merge arrays from object property in an object array [closed]从对象数组中的对象属性合并数组[关闭]
【发布时间】:2018-02-08 03:51:17
【问题描述】:

如下给出一个对象数组:

var objArray = [{'key': 'key1', 'fields': [1, 2]}, {'key': 'key2', 'fields': [3, 4]}];

我想从 fields 属性中获取一个合并项的数组,输出应该是 1, 2, 3, 4

我尝试如下合并。我对我的解决方案不满意,希望获得反馈并改进我的解决方案。我是 JS 和打字稿的新手。我相信 ES6 的特性有更好的解决方案。 有人可以帮助改进我的解决方案吗?

function mergeArraysFromObjectArray(objArray){
   let allFields = [];
    for (let obj of objArray) {
      for (let propt in obj) {
        if (obj.hasOwnProperty(propt) && propt === 'fields') {
          allFields = allFields.concat(obj[propt]);
        }
      }
    } 

  return allFields;
}

var objArray = [{'key': 'key1', 'fields': [1, 2]}, {'key': 'key2', 'fields': [3, 4]}];
let allMergedFields = mergeArraysFromObjectArray(objArray);

for(let i=0; i < allMergedFields.length; i++){
   console.log(allMergedFields[i]);  //prints - 1, 2, 3, 4
}

【问题讨论】:

  • 对于您想要审查的工作代码,请参阅codereview.stackexchange.com
  • 检查答案是你想要的
  • 我投票结束这个问题,因为它更适合codereview.stackexchange.com
  • 被建议为题外话的问题应移至 codereview.stackexchange.com,而不是基于意见关闭。

标签: javascript arrays typescript ecmascript-6


【解决方案1】:

您可以使用Array.prototype.map()Array.prototype.flat()

代码示例1:

const objArray = [{key: 'key1', fields: [1, 2]}, {key: 'key2', fields: [3, 4]}]
const result = objArray.map(({ fields }) => fields).flat()

console.log(result)

您也可以将Array.prototye.reduce()destructuring assignmentspread syntax 结合使用

代码示例2:

const objArray = [{key: 'key1', fields: [1, 2]}, {key: 'key2', fields: [3, 4]}]
const result = objArray.reduce((a, { fields }) => [...a, ...fields], [])

console.log(result)

也只使用Array.prototye.reduce() 结合Array.prototype.map()

代码示例 3:

const objArray = [{key: 'key1', fields: [1, 2]}, {key: 'key2', fields: [3, 4]}]
const result = objArray.reduce((a, { fields }) => a.concat(fields), [])

console.log(result)

【讨论】:

  • 这就是你正确的做法 :) Es6 宝贝 :) 干得好
【解决方案2】:

您可以使用扩展语法...map() 来获取fields 属性

var objArray = [{'key': 'key1', 'fields': [1, 2]}, {'key': 'key2', 'fields': [3, 4]}];
var result = [].concat(...objArray.map(({fields}) => fields))
console.log(result)

如果没有fields 属性,您还可以添加filter(Boolean) 以删除未定义。

var objArray = [{'key': 'key1', 'asdf': [1, 2]}, {'key': 'key2', 'fields': [3, 4]}];
var result = [].concat(...objArray.map(e => e.fields).filter(Boolean))
console.log(result)

【讨论】:

    【解决方案3】:

    您可以简单地concat 数组并在循环内创建一个新数组:

    var objArray = [{'key': 'key1', 'fields': [1, 2]}, {'key': 'key2', 'fields': [3, 4]}];
    
    var result = [];
    for(var i=0; i<objArray.length; i++){
       result = result.concat(objArray[i].fields);
    }
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 2021-03-29
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多