Javascript:如何从重复的数组值中仅删除一个值

4

我有一个数组['2530491','2530491','2530491','2530492'],其中2530491重复三次,我想从其中的3个中删除单个值2530491,所以输出应该像这样:['2530491','2530491','2530492']

fileArrayAnnounce_size = jQuery.grep(fileArrayAnnounce_size, function(value){
  return value != file_size.metas[0].size;
});

我尝试使用grip,但它会删除所有相同的值。我只想从重复项中删除单个值。


https://dev59.com/a2Ml5IYBdhLWcg3w76oI - SKARVA Bodavula
规则是什么?允许2个副本,但不能再多了吗? - charlietfl
@charlietfl 看起来是这样的。两次但不是三次。 - evolutionxbox
那么如果有四个相同的,您仍然只想删除一个项目吗?能否澄清一下规则? - evolutionxbox
@evolutionxbox 但是现在还不清楚,需要明确说明,因为仍然有不同的解释方式。 - charlietfl
显示剩余3条评论
3个回答

5
您可以使用spliceindexOf来删除第一个实例:
fileArrayAnnounce_size.splice(fileArrayAnnounce_size.indexOf('2530491'), 1)

更安全的方式:

var index = fileArrayAnnounce_size.indexOf('2530491')
if (index > -1) {
    fileArrayAnnounce_size.splice(index, 1);
}

检查并删除重复项:

var mapOfValues = fileArrayAnnounce_size.reduce(function(vals, current) {
    if (vals[current]) {
        vals[current]++;
    } else {
        vals[current] = 1;
    }

    return vals;
}, {});

现在检查并删除任何具有超过1个值的内容:

for (var value in mapOfValues) {
    if (mapOfValues[value] > 1) {
        var idx = fileArrayAnnounce_size.indexOf(value);
        fileArrayAnnounce_size.splice(idx, 1);
    }
}

演示:https://jsfiddle.net/1277mxt9/


2
不明白这如何验证是否存在重复。 - charlietfl
我的意思是,这个方法可以用,_但是_前提是你已经知道了重复的值。 - George
更新了代码以查找重复值或更多,并找到一种方法来删除每个值中的一个。 - tymeJV
OP又改变了需求...从一组重复项中删除一个且仅一个重复项,无论有多少个。3个重复项变成2个,4个重复项变成3个,以此类推。 - evolutionxbox
1
非常肯定上面的编辑是正常工作的 @evolutionxbox - tymeJV
显示剩余2条评论

2
您可以检查给定的元素是否存在重复元素,如果存在,则从原始数组中仅删除指定元素的一个重复条目。

var arr = ['2530491','2530491','2530491','2530492'],
    hash = [...new Set(arr)];
    hash.forEach((v,i) => arr.indexOf(v) != arr.lastIndexOf(v) ? arr.splice(arr.indexOf(v), 1) : null);
    
    console.log(arr);


我喜欢简单。 - HiFlyer Ojt

1
你可以使用filter()函数,并将一个对象作为thisArg参数传递进去,以便将其用作哈希表。

var data = ['2530491','2530491','2530491','2530492', '2530492'];

var result = data.filter(function(e) {
  if(!this[e]) this[e] = 1
  else if (this[e] == 1) return this[e] = 2, false
  return true;
}, {})

console.log(result)


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