Javascript 仅从阵列中删除一个副本

Javascript 仅从阵列中删除一个副本,javascript,Javascript,我试图只从数组中删除其中一个2,但我的代码删除了所有2。我的代码如下: var arr = [2,7,9,5,2] arr.filter(item => ((item !== 2))); 以及: 两个都拆下所有2。我考虑过删除重复项,如果只有一个重复项,则可以删除重复项-例如: Array.from(new Set([2,7,9,5,2])); function uniq(a) { return Array.from(new Set(a)) } 但如果存在多个重复项,则会失败,因为

我试图只从数组中删除其中一个2,但我的代码删除了所有2。我的代码如下:

var arr = [2,7,9,5,2]
arr.filter(item => ((item !== 2)));
以及:

两个都拆下所有2。我考虑过删除重复项,如果只有一个重复项,则可以删除重复项-例如:

Array.from(new Set([2,7,9,5,2]));
function uniq(a) {
 return Array.from(new Set(a)) 
}
但如果存在多个重复项,则会失败,因为它只会删除所有重复项,包括任何其他重复的数字:

Array.from(new Set([2,7,9,9,2,2,5,2]));
function uniq(a) {
 return Array.from(new Set(a)) 
}

有人知道如何只拆下其中一个2吗?感谢您的帮助。

有多种方法可以做到这一点;一个相对简单的方法是使用
indexOf
;请参阅其他帖子:

var数组=[2,7,9,5,2];
console.log(数组)
var-index=array.indexOf(2);
如果(索引>-1){
阵列拼接(索引1);
}
//数组=[7,9,5,2]
console.log(数组)您可以执行以下操作:

const arr=[2,7,9,2,2,5,2];
const result=arr
.减少((a,c)=>{
a、 温度[c]=++a.temp[c]| 1;
如果(a.temp[c]!==2){
a、 推送(c);
}
返回a;
},{temp:{},数组:[]})
.阵列;

控制台日志(结果)
您可以将
indexOf
方法与
splice
结合使用

var arr=[2,7,9,5,2]
var idx=arr.indexOf(2)
如果(idx>=0){
阵列拼接(idx,1);
}

控制台日志(arr)
您可以使用计数器进行关闭,并仅移除第一个
2

var数组=[2,7,9,2,3,2,5,2],
result=array.filter((i=>v=>v!==2 | |--i)(1));

控制台日志(结果)您可以遵循以下方法

var arr= [2,3,4,2,4,5];
var unique = [];
$.each(arr, function(i, el){
    if($.inArray(el, unique) === -1) unique.push(el);
})

筛选阵列中所有重复项的最简单方法:

arr.filter((item, position) => arr.indexOf(item) === position)
如果已经存在具有相同值的另一个元素,则此方法跳过该元素

如果只需要筛选第一个重复项,则可以使用其他布尔键:

arr.filter((item, position) => {
  if (!already && arr.indexOf(item) !== position) {
    already = true
    return false
  } else return true
})
但这种方法已经过热。最聪明的方法是使用
进行
循环:

for (let i = 0; i < arr.length; i++) {
  if (arr.indexOf(arr[i]) !== i) {
    arr.splice(i,1);
    break;
  }
}
for(设i=0;i
找到值为2的索引时,创建一个简单的循环:
.splice(idx,1)
此索引和
断开
循环要删除哪一个?Close的第一个
2
,或最后一个,或…可能的重复项,但如果数组中不存在该数字,它将无法正常工作;检查
indexOf
是否为非负将使其更加健壮。有趣的答案。v和(1)和(2)代表什么?我是JS新手,以前从未见过这种语法-你能链接到我能读到的任何东西来学习吗?一个是删除第一个出现的
2
,第二个出现两个,依此类推。它可以工作,因为数字会递减,如果为零,则值会被过滤掉。该技术的名称是带有IIFE(立即调用的函数表达式)的闭包。
for (let i = 0; i < arr.length; i++) {
  if (arr.indexOf(arr[i]) !== i) {
    arr.splice(i,1);
    break;
  }
}