【问题标题】:How to remove an object with a given property from an array [duplicate]如何从数组中删除具有给定属性的对象[重复]
【发布时间】:2016-11-13 04:04:32
【问题描述】:

我有一个包含多个对象的数组,如下所示。如何删除包含特定值的完整对象。

var cars=  [
{key: 'browser', label: 'Chrome'},
{key: 'browser', label: 'Firefox'},
{key: 'browser', label: 'Safari'}
];

例如要移除的对象是那些包含标签 chrome 和 safari 的对象。

我遇到过一维值数组的例子,但这是一个对象数组。

【问题讨论】:

  • 这不是多维数组,它是对象的一维数组
  • @ 在你的输出中你只想有 {key: 'browser', label: 'Firefox'} ??
  • @HenryDev 是的,我只想要 {key: 'browser', label: 'Firefox'}
  • 你想破坏性地删除不需要的元素,还是创建一个没有它们的新数组?
  • 以下谷歌搜索出现了答案:“从数组中删除对象的属性”。

标签: javascript arrays


【解决方案1】:

您可以使用Array.prototype.filter 仅返回某些值或仅排除某些值。

var cars =  [
  {key: 'browser', label: 'Chrome'},
  {key: 'browser', label: 'Firefox'},
  {key: 'browser', label: 'Safari'}
];

// Filter by only the thing you want
var firefoxOnly = cars.filter(function(item) {
  return item.label === 'Firefox';
});

console.log(firefoxOnly);

// filter out the things you don't want
var notChromeSafari  = cars.filter(function(item) {
  return item.label !== 'Chrome' && item.label !== 'Safari';
});

console.log(notChromeSafari);

// or make a set of exclusions to filter out things you don't want
// you could also make this a list of inclusions, 
// it would be the inverse of this. I'll leave that as an exercise for the reader.
var exclusions = ['Chrome', 'Safari'];

var filtered  = cars.filter(function(item) {
  // only return items that are not in the exclusion list
  return exclusions.indexOf(item.label) === -1;
});

console.log(filtered);

【讨论】:

    【解决方案2】:

    只需遍历数组并通过检查属性是否为给定值来删除您不想要的项目。请注意,您需要从最后一个循环到第一个,以便每次迭代时索引都是正确的。

    var cars=  [
        {key: 'browser', label: 'Chrome'},
        {key: 'browser', label: 'Firefox'},
        {key: 'browser', label: 'Safari'}
    ];
    
    for(var i = cars.length -1; i >= 0 ; i--){
        if(cars.label == "Safari" || cars.label == "Chrome"){
            cars.splice(i, 1);
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用Array filter 函数来实现这一点。

      var cars = [{
        key: 'browser',
        label: 'Chrome'
      }, {
        key: 'browser',
        label: 'Firefox'
      }, {
        key: 'browser',
        label: 'Safari'
      }];
      
      let removeKeys = ["Safari", "Chrome"];
      
      let filteredArray = cars.filter((obj) => removeKeys.indexOf(obj.label) === -1);
      
      console.log(filteredArray);

      【讨论】:

        【解决方案4】:

        这个解决方案怎么样:

        var cars=  [
         {key: 'browser', label: 'Chrome'},
         {key: 'browser', label: 'Firefox'},
         {key: 'browser', label: 'Safari'}
         ];
        
        var arr = [];
        for(var i = 0; i < cars.length; i++){
         if(cars[i].label !== 'Safari' && cars[i].label !== 'Chrome'){
          arr.push(cars[i]);
         }
        }
        console.log(arr);

        【讨论】:

        • 这将返回标签不匹配的单个对象,但他想返回一个所有标签不匹配的对象的数组。
        • @torazaburo 不,你错了。看看他发表的评论。他说他想要:{key: 'browser', label: 'Firefox'} 这就是我所做的:)
        • 我没有看到他说他想要那个的地方。他说我怎样才能删除包含特定值的完整对象,这清楚地表明他想要一个删除了这些对象的数组。
        • @torazaburo 是的,他说他只想要对象而不是数组。执行 Control + F 并搜索 HenryDev,您将看到他对我所做的评论。同样,他只想要对象 {key: 'browser', label: 'Firefox'}
        • 你误读了他的评论。 是的,我只想要 {key: 'browser', label: 'Firefox'} 他的意思是他只想要 在结果数组中(因为这是唯一不匹配 Chrome 或 Safari 的;如果有输入中的其他元素,大概他还想在输出数组中保留这些元素。
        【解决方案5】:

        首先你需要找到你要删除的对象标签的索引。

        var cars= [ {key: 'browser', label: 'Chrome'}, {key: 'browser', label: 'Firefox'}, {key: 'browser', label: 'Safari'} ];
        
        for(var i = 0; i < cars.length ; i++)
        { 
             if(cars.label == "Safari" || cars.label == "Chrome")
             { 
                   delete cars[i].label
             }
        }
        

        这只会删除 lebel。如果要删除整个元素,请使用cars.splice(i, 1)

        【讨论】:

        • 这将删除label属性,但他想从数组中删除它出现的对象。
        猜你喜欢
        • 2014-03-08
        • 1970-01-01
        • 2015-12-14
        • 1970-01-01
        • 2020-07-25
        • 2021-06-18
        • 2012-04-17
        • 1970-01-01
        • 2019-12-12
        相关资源
        最近更新 更多