【问题标题】:Iterate over JavaScript Object and Remove Array [closed]迭代 JavaScript 对象并删除数组 [关闭]
【发布时间】:2017-07-07 03:51:43
【问题描述】:

我有这样的 ab 对象:

{cards: [{id: 1}], [{id: 2}],[{id: 2}],[{id: 3}],[{id: 4}] ]

我想从对象中删除例如 id:3 并尝试了这个:

        for (let key in _tempCards.cards) {

            if (_tempCards.cards[key].id === 3)
                delete _tempCards.cards[key];

    }

对象应该是这样的

{cards: [{id: 1}], [{id: 2}],[{id: 2}],[{id: 4}] ]

如何删除这部分对象?

【问题讨论】:

  • 提供的对象无效
  • @all 错误重复。它没有被唤醒,因为它是对象中的数组中的数组中的对象。与提供的答案无关。
  • @Zakaria Acharki 这不是重复的... OP 问题与您提供的链接中的问题不同。

标签: javascript


【解决方案1】:

你提供的代码不是一个对象,不管你怎么看。

{cards: [{id: 1}], [{id: 2}],[{id: 2}],[{id: 3}],[{id: 4}] ]

让我们分解一下:

  1. 您打开一个对象,但从不关闭它。好吧,让我们关闭它...
    {cards: [{id: 1}], [{id: 2}],[{id: 2}],[{id: 3}],[{id: 4}] ]}

  2. 现在你(有点)有一个对象,第一个属性(cards)包含一个带有单个对象的数组:[{id:1}],而不是你有一堆其他属性没有键,它们与cards 处于同一级别,它们不在父对象的cards 属性内,我相信你打算......

    李>
  3. ...并且您还在最后一个 keyless 属性之后关闭了一个数组,我不知道您从哪里开始(/打算开始但忘记了),所以我有将其删除以获取有效对象。

我对你的对象应该是什么样子的最佳猜测是:

{ cards: [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 } ] }

或者,美化了……

Object = {
  cards: [{
    id: 1
  },
  {
    id: 2
  },
  {
    id: 3
  },
  {
    id: 4
  }]
}

您现在在Objectcards 属性中有一个对象数组。另一个可能的数据结构是

cards: [ [{ id: 1 }], [{ id: 2 }], [{ id: 3 }], [{ id: 4 }] ]

这是 @KindUser 被认为最有可能用于您的数据的结构。


结论:,很明显你的对象是“人造的”。这是错误的。您要么使用工具来验证和可视化您的数据(搜索“JSON 查看器”、“美化 js”等),要么更加关注自己在做什么。

【讨论】:

    【解决方案2】:
    _tempCards.cards=_tempCards.cards.filter(function(arr){
        return arr[0].id!==3;//allow every arrays first element, that hasnt an id of 3
    });
    

    您可以使用酷炫的 Array.prototype.filter 来过滤您的数组。您的代码基本上可以工作,但您必须考虑到,您的数组包含包含您的对象的数组。

    for (let key in _tempCards.cards) {
        if (_tempCards.cards[key][0].id === 3)
                delete _tempCards.cards[key];
        }
    }
    

    【讨论】:

      【解决方案3】:

      必须稍微重构您的对象才能使其工作。

      var _tempCards = {
        cards: [
          [{
            id: 1
          }],
          [{
            id: 2
          }],
          [{
            id: 3
          }],
          [{
            id: 4
          }]
        ]
      }
      
      for (var i = 0; i < _tempCards.cards.length; i++) {
        if (_tempCards.cards[i][0].id == 3) {
          _tempCards.cards.splice(i, 1);
        }
      }
      
      console.log(_tempCards);

      【讨论】:

      • 很明显他的数据对象坏了。因此,您必须通过选择似乎可能的特定数据结构来修复它。然而,你没有解释你做了什么,明天他们可能会犯同样的错误,不知道他们错在哪里,尝试 "your fix" 并且......你猜怎么着?它行不通。最好您解释他们错在哪里以及他们如何改进他们的方法/方法,以免再次犯同样的错误。我希望你同意。干杯!
      • @AndreiGheorghiu 他在cards: 之后错过了一个方括号[[key] 之后的元素索引[0](这是错误的)。
      • 我相信你应该告诉他们。你知道他们会从你的回答中学到什么吗?他们不会学习如何验证他们的数据,而是会知道他们需要将对象放在Stack Overflow 上,希望某个好心的用户会重构它。你明白我的意思吗?
      • @AndreiGheorghiu 我会编辑我的答案并描述一切,但你已经描述得很漂亮了。 :)
      • 没关系,我的意思是让你理解和改进你未来的答案,而不是特别是这个。保重,记得玩得开心。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2019-02-12
      • 2017-03-29
      • 2019-02-27
      • 2019-07-27
      • 1970-01-01
      相关资源
      最近更新 更多