如何删除数组中对象的值

3

为什么这个不起作用?在我看来一切都正确。难道我漏了什么吗?

编写一个名为removePartyKillers的函数,该函数接受类似于“playlist”(见下文)的数组,并返回已删除任何长度超过8分钟的歌曲的该播放列表的副本。您可以安全地假设播放列表是对象数组。每个对象将具有属性标题、艺术家和持续时间(以秒为单位)。

var awesomePlaylist = [
  {
    title: "Hay Day",
    artist: "Robo-Crop",
    durationInSeconds: 378
  }, {
    title: "10,000 Pounds",
    artist: "L-Ton Jonn",
    durationInSeconds: 498,
  }, {
    title: "Caesar's Salad",
    artist: "DJ Dinner Julius",
    durationInSeconds: 600,
  }, {
    title: "The British Are On Their Way",
    artist: "Raul Pevere",
    durationInSeconds: 1095,
  }, {
    title: "13th",
    artist: "The Doctors",
    durationInSeconds: 185,
  }
];

function removePartyKillers(arr) {
    var copy = arr.slice();
    for (var key of copy) {
        for (var key2 in key) {
            if (key2['durationInSeconds'] > (60 * 8)) {
                delete key2;
            }
        }
    }
    return copy;
}

console.log(removePartyKillers(awesomePlaylist));
 /* Results:
  {
    title: "Hay Day",
    artist: "Robo-Crop",
    durationInSeconds: 378
  }, {
    title: "13th",
    artist: "The Doctors",
    durationInSeconds: 185,
  }
]
*/ 

不,因为我相信那就是我所做的。 - Ryan Farm
4个回答

6

我认为在这种情况下 .filter() 很有用。

注意: awesomePlaylist 本身不是一个对象(关联数组),而是一个数组;因此需要操作一个数组。 delete 操作的是对象中的属性。

let awesomePlaylist = [{
  title: "Hay Day",
  artist: "Robo-Crop",
  durationInSeconds: 378
}, {
  title: "10,000 Pounds",
  artist: "L-Ton Jonn",
  durationInSeconds: 498,
}, {
  title: "Caesar's Salad",
  artist: "DJ Dinner Julius",
  durationInSeconds: 600,
}, {
  title: "The British Are On Their Way",
  artist: "Raul Pevere",
  durationInSeconds: 1095,
}, {
  title: "13th",
  artist: "The Doctors",
  durationInSeconds: 185,
}];

function removePartyKillers(arr) {
  return arr.filter(song => song.durationInSeconds <= 8*60)
}

console.log(removePartyKillers(awesomePlaylist));


不,你不能这样做。我在你的代码中发现了一个错误。我正在努力解决它,哈哈。请稍等片刻。或者我希望有人能够解决它 :) - Miu
1
我想我明白你的意思了。所以,如果我只想删除durationInSeconds键但仍然返回数组元素中剩余的2个键,那么删除操作会起作用吗? - Ryan Farm
没错,就是这样 :) 对不起,我的解释不太好。 - Miu
1
这是最JavaScript的解决方案,但会创建一个副本。如果您不需要元素,可以在循环中切割它们。但要更精确地说,数组也是对象,并且在JavaScript中没有“关联数组”,这是其他语言的人为JS对象施加的语义概念。https://blog.kevinchisholm.com/javascript/associative-arrays-in-javascript/ - PeterT
谢谢你的评论,Peter T :) 我非常感激。我知道数组在技术上是一个对象。但我不知道“关联数组”不是JS的东西。由于你,我很高兴知道这个事实。我们应该如何称呼它们以区分它们? - Miu
显示剩余3条评论

1
问题在于key本身是一个对象,当它进入下一行时,你试图访问对象内所有可能的属性的'durationofSeconds'。你可以直接使用key访问预期的属性并进行检查。
function removePartyKillers(arr) {
    var copy = arr.slice();
    for (var key of copy) {
            if (key['durationInSeconds'] > (60 * 8)) {
                delete key['durationInSeconds'];
            
            //console.log(key)
        }
    }
    return copy;
}

output


1

delete 只能用于删除对象的键。你不能使用它来删除数组中的元素。可以创建一个新的空数组并添加筛选后的元素(或者更好的方法是: 使用 .filter):

var awesomePlaylist = [
  {
    title: "Hay Day",
    artist: "Robo-Crop",
    durationInSeconds: 378
  }, {
    title: "10,000 Pounds",
    artist: "L-Ton Jonn",
    durationInSeconds: 498,
  }, {
    title: "Caesar's Salad",
    artist: "DJ Dinner Julius",
    durationInSeconds: 600,
  }, {
    title: "The British Are On Their Way",
    artist: "Raul Pevere",
    durationInSeconds: 1095,
  }, {
    title: "13th",
    artist: "The Doctors",
    durationInSeconds: 185,
  }
];

function removePartyKillers(arr) {
    var copy = [];
    for (var item of arr) {
        if (item['durationInSeconds'] <= (60 * 8)) {
            copy.push(item);
        }
    }
    return copy;
}

console.log(removePartyKillers(awesomePlaylist));


1
如Miu所说,删除语句仅用于对象属性,而非数组元素。
在不使用过滤器的情况下,实现此目标的最佳方法之一是反向循环数组,根据需要删除项目。之所以需要反向循环是因为,如果您删除一个项目,则下一个项目将接收其索引,您最终会跳过它。

var awesomePlaylist = [
  {
    title: "Hay Day",
    artist: "Robo-Crop",
    durationInSeconds: 378
  }, {
    title: "10,000 Pounds",
    artist: "L-Ton Jonn",
    durationInSeconds: 498,
  }, {
    title: "Caesar's Salad",
    artist: "DJ Dinner Julius",
    durationInSeconds: 600,
  }, {
    title: "The British Are On Their Way",
    artist: "Raul Pevere",
    durationInSeconds: 1095,
  }, {
    title: "13th",
    artist: "The Doctors",
    durationInSeconds: 185,
  }
];

function removePartyKillers(arr) {
    var copy = arr.slice();
    for (var i = copy.length - 1; i >= 0; i--) {
        var obj = copy[i];
        if (obj['durationInSeconds'] > (60 * 8)) {
            copy.splice(i, 1);
        }
    }
    return copy;
}

console.log(removePartyKillers(awesomePlaylist));
 /* Results:
  {
    title: "Hay Day",
    artist: "Robo-Crop",
    durationInSeconds: 378
  }, {
    title: "13th",
    artist: "The Doctors",
    durationInSeconds: 185,
  }
]
*/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接