Javascript 如果找到2个或更多值,如何在数组中搜索一个值并仅删除其中一个值?

Javascript 如果找到2个或更多值,如何在数组中搜索一个值并仅删除其中一个值?,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个数组 var aos = ["a","a","a","b","b","c","d","d"]; 我想知道如果在数组中发现2个或更多相同的值,是否可以只删除1个项。例如,如果它发现 “a”、“a” 它将删除其中一个“a” 这是我当前的代码: var intDennis = 1; for (var i = 0; i < aos.length; i++) { while (aos[i

我有一个数组

var aos = ["a","a","a","b","b","c","d","d"];
我想知道如果在数组中发现2个或更多相同的值,是否可以只删除1个项。例如,如果它发现

“a”、“a”

它将删除其中一个“a”

这是我当前的代码:

var intDennis = 1;
                        for (var i = 0; i < aos.length; i++) {
                            while (aos[i] == aos[intDennis]) {
                                aos.splice(i, 1);
                                intDennis++;
                                console.log(aos[intDennis], aos[i]);
                            } 
                            intDennis = 1;
                        }
var intDennis=1;
对于(变量i=0;i

注意:我的数组已排序。

更新答案以仅删除1个重复项:

假设每个对象将解析为唯一的字符串,下面是一个可能的解决方案。第一次检测到对象时,它会将该对象的计数器设置为1。如果它再次找到该对象,它将拼接该元素并增加相关计数器。如果它找到该元素的次数更多,它将不处理它

var elements = {};
for (var i = 0; i < aos.length; i++) {
    if(elements[aos[i]]){
        if(elements[aos[i]] == 1){
            aos.splice(i,1);//splice the element out of the array
            i--;//Decrement the counter to account for the reduced array
            elements[aos[i]]++;//Increment the count for the object
        }
    } else {
        elements[aos[i]] = 1;//Initialize the count for this object to 1;
    }
}
var元素={};
对于(变量i=0;i

在更好地理解OP用例后编辑。 更新解决方案和小提琴测试,将pst的建议纳入评论中

(并非毫无意义,但此方法不要求对原始数组进行排序。)

试试这个

var elements = [];
var temp = {};
for (i=0; i<aos.length; i++) {
    temp[aos[i]] = (temp[aos[i]] || 0) + 1;
}
for (var x in temp) {
    elements.push(x);
    for (i=0; i<temp[x]-2; i++) {
        elements.push(x);
    }
}
var元素=[];
var temp={};

对于(i=0;i

修订示例

function removeDuplicate(arr) {
    var i = 1;
    while(i < arr.length) {
        if(arr[i] == arr[i - 1]) {
            arr.splice(i, 1);
        }
        while(arr[i] == arr[i - 1] && i < arr.length) {
            i += 1;
        }
        i += 1;
    }
    return arr;
}
alert(removeDuplicate(["a","a","a","b","b","c","d","d"]));
功能移除副本(arr){
var i=1;
而(i
我认为在未排序的数组上没有比使用O(n^2)行为的方法更好的方法了。鉴于ES5数组内置(在所有现代浏览器中都受支持,但在IE9之前的IE中不受支持),以下方法有效:


aos.filter(function(value,index,obj){return obj.indexOf(value)==index;})
我不会改变输入——也就是说,不要使用
splice
。这将大大简化问题。在这里使用新的数组对象实际上可能更有效。这种方法利用了输入数组被排序的事实

考虑:()

var输入=[“a”、“a”、“a”、“b”、“b”、“c”、“d”、“d”]
var结果=[]
对于(变量i=0;i
快乐编码



根据需要,用自定义等式替换
=
。请注意,这是输出中省略的第一项,它可能并不总是“正确的”。

因为您说您有一个排序数组,您只需要在第二次找到元素时删除它。您只需要一个即可。 函数的
splice()
返回已删除的元素,因此,只需使用它,即可不删除更多此类元素

此解决方案更清洁、更高效

var aos = ["a","a","a","b","b","c","d","d"];
var lastRemoved = "";
for (var i = 1; i < aos.length; i++) {
    if (aos[(i-1)] == aos[i] && lastRemoved != aos[i]) {
         lastRemoved = aos.splice(i, 1);
    }
}
var aos=[“a”、“a”、“a”、“b”、“b”、“c”、“d”、“d”];
var lastRemoved=“”;
对于(变量i=1;i

代码测试和运行。结果:[“a”、“a”、“b”、“c”、“d”]

这不起作用,因为对象只有字符串作为属性值,因此,例如,[1,“1”]将减少到[1]。同样,[“toString”]将变成[]
@gsnedders是的,只有当值解析为唯一字符串时,这才有效。在他的示例中,他只有字符串,所以这个解决方案应该有效。@Dennis Martinez Answer现在更新为只删除一个重复值。我感谢所有答案,但似乎有些答案偏离了轨道,我需要一些帮助,只删除重复值中的一个值,不是所有的重复值,所以如果我有3个“a”,我只想删除其中一个“a”的。我可能需要找到一种不同的方法,而不是删除重复项,任何建议都会非常棒。是否只需要在有重复项的情况下删除一个值?我在下面更新了我的答案,以便您澄清需要。我在下面发布了此问题的答案--上面发布的方法的一个问题是
splice
变异数组,因此使用的偏移量(例如,代码> IndNISS <代码>)在数据上变得错误(也我怀疑探针应该是代码> IndNISN+I/COD>)。如果需要变异方法,考虑迭代/反向工作,这将消除索引偏移问题(不是我保证它是唯一的问题;-)+ 1。(因为这类似于桶排序的最后阶段);但是,考虑初始临时生成器的简化:<代码>(x≤0)+ 1 < /代码> ->代码> 1 >代码>,其中<代码> x>代码>是一个假Y值,包括<代码>未定义< /代码>和<代码> 0 < /代码>。非常好,我不知道如何在JS-易在Ruby中,在我住的地方这样做。你帮我省去了一个半小时的头痛!谢谢!这会很好的
var aos = ["a","a","a","b","b","c","d","d"];
var lastRemoved = "";
for (var i = 1; i < aos.length; i++) {
    if (aos[(i-1)] == aos[i] && lastRemoved != aos[i]) {
         lastRemoved = aos.splice(i, 1);
    }
}