您如何将孩子推入数组?

时间:2018-12-24 12:35:01

标签: angular typescript

我从Google People API获得了一个承诺,我想根据部分数据创建一个数组。我不知道如何在数组中制作子元素。

我已经阅读了所有可以找到的文章,但是其中大多数都引用了DOM元素,并且我正在Angular中进行构建。我敢肯定这很简单,但是我找不到能帮助我的例子。

let arr = new Array();

for (var a = 0; a < this.k4kItems.length; a++) {
  arr.push(this.k4kItems[a].requestedResourceName);
  for (var b = 0; b < this.k4kItems[a].person.names.length; b++) {
    if (this.k4kItems[a].person.names[b].metadata.source.type === "CONTACT") {
      arr[a].push(this.k4kItems[a].person.names[b]);
    }
  }
}
console.log(arr);

Angular编译它没有任何错误,但是控制台日志提供以下内容:错误:未捕获(承诺):TypeError:arr [a] .push不是函数 TypeError:arr [a] .push不是函数

2 个答案:

答案 0 :(得分:3)

执行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]);
    }
  }
}

这是使用mapfilter来做同一件事的一种更现代,更优雅的方式

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

答案 1 :(得分:0)

您必须确保在arr数组中推送数组,这意味着如果this.k4kItems[a].requestedResourceName不是数组,则会出现该错误。