首页 > 解决方案 > 如何将对象的子元素推送到数组中?

问题描述

我有一个来自 Google People API 的承诺,我想从部分数据中创建一个数组。我无法弄清楚如何在数组中创建子元素。

let arr = new Array();

for (var a = 0; a < obj.length; a++) {
    arr.push(obj[a].requestedResourceName);
    for (var b = 0; b < obj[a].person.names.length; b++) {
        if (obj[a].person.names[b].metadata.source.type === 'CONTACT') {
            arr[a].push(obj[a].person.names[b]);
        }
    }
}

错误是:错误:未捕获(在承诺中):TypeError:arr [a] .push不是函数

标签: angulartypescript

解决方案


当你添加一些不是数组的东西arr[a]arr.push(this.k4kItems[a].requestedResourceName)

一个建议是添加一个包含 children 属性的对象

let arr = new Array();

for (var a = 0; a < this.k4kItems.length; a++) {
  // Adding object with children array
  arr.push({item: this.k4kItems[a].requestedResourceName, children: []});
  for (var b = 0; b < this.k4kItems[a].person.names.length; b++) {
    if (this.k4kItems[a].person.names[b].metadata.source.type === "CONTACT") { 
      // Pushing to that array, notice we use .children to push child items
      arr[a].children.push(this.k4kItems[a].person.names[b]);
    }
  }
}

这是使用地图过滤器做同样事情的更现代和优雅的方式

const arr = this.k4kItems.map(item => ({
    item,
    children: item.person.names.filter(
       name => name.metadata.source.type === "CONTACT"
    )
}))

推荐阅读