如何解决如果找到2个或更多,如何搜索数组中的值并删除其中一个值?
| 我有一个数组var aos = [\"a\",\"a\",\"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;
}
注意:我的数组已排序。
解决方法
在更好地了解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);
}
}
小提琴测试
, 因为您说自己有一个已排序的数组,所以只需要在第二次找到元素时就删除它。您只需要一个。
splice()
函数返回已删除的元素,因此,只需使用它就不会删除更多此类元素。
该解决方案更加干净高效。
var aos = [\"a\",\"a\",\"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);
}
}
经过代码测试并可以正常工作结果:[\“ a \”,\“ a \”,\“ b \”,\“ c \”,\“ d \”]
, 我不相信有比O(n ^ 2)行为更好的方法来对未排序的数组执行此操作。给定ES5 array-builtins(在所有现代浏览器中都受支持,尽管IE9之前的IE中不支持),以下工作原理:
aos.filter(function(value,index,obj) { return obj.indexOf(value) === index; })
, 更新的答案仅删除1个重复项:
假设每个对象都将解析为唯一的String,这是一个潜在的解决方案。第一次检测到该对象时,它将该对象的计数器设置为一个。如果再次找到该对象,则将其剪接并增加关联的计数器。如果它发现该元素的次数更多,它将不理会它。
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;
}
}
这是为此的测试小提琴。
, 我不会更改输入-也就是说,不要使用splice
。这将大大简化问题。在这里使用新的数组对象实际上可能更有效。这种方法利用了对输入数组进行排序的事实。
考虑:(jsfiddle演示)
var input = [\"a\",\"d\"]
var result = []
for (var i = 0; i < input.length; i++) {
var elm = input[i]
if (input[i+1] === elm) {
// skip first element (we know next is dup.)
var j = i + 1
for (; input[j] === elm && j < input.length; j++) {
result.push(input[j])
}
i = j - 1
} else {
result.push(elm)
}
}
alert(result) // a,a,b,c,d
快乐的编码。
根据需要用自定义等式替换ѭ10。请注意,它是输出中省略的第一项,它不一定总是\“ correct \”。
, 修订示例
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\",\"d\"]));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。