打字稿推送到数组中的特定键

时间:2017-07-14 01:17:56

标签: javascript arrays angular typescript

我正在使用Firebase处理Angular2项目。

我需要在this.guestPush中的相同密钥下推送所有查询结果。

我有一个包含不同用户级别的多选元素。 4,6,9。

当选择一个级别时,结果对象将保存在guestPush数组中,但是当选择另一个级别时,会发生以下错误。

我收到此错误:

  

ERROR TypeError: this.guestPush [(" filter " + i)]。push不是函数

这是我的代码:

  guestPush: any[] = new Array;

  level.forEach((lvl, index) => {

    this.db.object(`levelsUsers/${lvl}/users`)
      .subscribe(users => {

        if (this.guestPush['filter_' + i]) {
          this.guestPush['filter_' + i].push(users);
        } else {
          this.guestPush['filter_' + i] = users;
        }

      }, err => console.log(err));

  });

编辑***

包含与过滤器匹配的用户的用户对象:

Object {-KmSjAaxdCUvrPEQ8InI: Object, $key: "users", $exists: function}
  -KmSjAaxdCUvrPEQ8InI: Object
    admin:"false"
    description:"desc"
    ...
    ...
    verified:false
  __proto__:Object
  exists:function ()
  $key:"users"
  __proto__:Object

this.guestPush[i] = users;创建一个这样的对象:

[Object]
 0:Object
 -KmSjAaxdCUvrPEQ8InI: Object
    admin:"false"
    description:desc"
    ...
    ...
    verified:false
    __proto__:Object
  $exists:function ()
  $key:"users"
  __proto__:Object
 length:1
 __proto__:Array(0)

因此,在下一个循环中,我想在-KmSjAaxdCUvrPEQ8InI旁边添加任何新用户对象,只要将其添加为0键的值。

5 个答案:

答案 0 :(得分:11)

看起来您正在获取数组响应,并且您将其分配给对象:

this.guestPush['filter_' + i] = users;

所以this.guestPush['filter_'+ i]现在是数组类型。如果要向其添加另一个users对象,实际上是在向现有数组添加另一个数组。在这种情况下你不应该使用concat吗?

if (this.guestPush['filter_' + i]) {
    this.guestPush['filter_' + i].concat(users);
} else {
    this.guestPush['filter_' + i] = users;
}

如果users不是数组,那么它应该是

if (this.guestPush['filter_' + i]) {
    this.guestPush['filter_' + i].push(users);
} else {
    this.guestPush['filter_' + i] = [users];
}

答案 1 :(得分:8)

我最终使用

 this.guestPush.push({ [i]: { [key]: obj } });

答案 2 :(得分:2)

@Ciprian:根据你的回答。

您需要对代码进行一些小改动才能使用。我希望下面的代码对你来说足够了。

Thread.sleep()

答案 3 :(得分:2)

这是你的问题,

guestPush: any[] = new Array;
'filter_' + i // this will yield a string.
this.guestPush['filter_' + i])

我可以定义一个对象:

let name = {};
name['x'] = 'blah';
or name.x = 'blahblah'; // name.x does same thing as name['x']

我认为你的思维name['x'] = 'blah';是一个数组,当它的对象语法时。

因此,您需要考虑实施Dictionary

答案 4 :(得分:1)

  

Typescript推送到数组中的特定键

您需要使用数组上的splice方法 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice