JS筛选
js 中的数组怎么取出没有相同的记录啊比如 一个数组 var s =[1,2,4,5,6,7,7,8,8,2,3,4]
我现在要得结果是[1,2,4,5,6,7,8,3]
求救~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
www.prototypejs.com
原理是很简单的,就是用一个新数组来返回结果,遍历旧数组,往里面加数据,每次加数据都判断新数组里是否有该数据
[[it] 本帖最后由 渚薰 于 2008-3-28 08:46 编辑 [/it]] 昨晚刚看楼主这道问题的时候,我觉得非常easy,甚至有点不屑一顾,于是我就开始写代码想来解决楼主的这个问题了。
但是当我写好代码调试的时候,那些结果总是不堪入目,后来用过不少方法去试验,但是都不是想要的结果,这才发现
原来我一直都没有遇到过这样的问题,以前倒是遇到过删除列表项中重复的选项的,但是列表框的起码也有个Remove()
方法来操作。于是我就翻阅Javascript的资料,OH NO!原来Javascript的数组没有删除数组元素的方法。于是,自己就
写代码,但是可能开始时候自己的思路就错了吧,于是就一直将错就错,昨晚直到错到自己都有点灰心了,于是当时就
唯有等待改天看高手如何帮楼主的解答了。
还好今早我一早醒了突然思路就清晰了!看来算法不应该在电脑前去思考,呵呵。
(想说一句的是,楼上的斑竹,我怎么打不开www.prototypejs.com,或者说里面没内容)
于是就有了下面的代码:
<html>
<script>
//delPointElement(arr,index)函数用来删除数组中指定的元素,具体可参考《数据结构》顺序表的删除元素算法
function delPointElement(arr,index)
{
for(i=index;i<arr.length-1;i++)
{
arr[i]=arr[i+1];
}
arr.length=arr.length-1;
}
var st=[1,2,4,5,6,7,7,8,8,2,3,4];
var s2=new Array(); //存储数组中相同元素的下标位置
//下面的双重循环遍历数组用来获取数组中相同元素的下标位置
for(i=0;i<st.length;i++)
{
for(j=i+1;j<st.length;j++)
{
if(st[j]==st[i])
{
s2.push(j);
}
}
}
//将原来数组中相同的元素值设为null
for(i=0;i<s2.length;i++)
{
st[s2[i]]=null;
}
//下面是一个递归函数用来删除数组中所有值为null的元素
function Recursion(count)
{
if(count<=0)
{
return;
}
for(i=0;i<count;i++)
{
if(st[i]==null)
{
delPointElement(st,i);
}
}
Recursion(count-1);
}
Recursion(st.length)
//输出最后的结果
for(i=0;i<st.length;i++)
{
document.write(st[i]);
}
</script>
</html>
删除数组中的元素?!我这里有个,算吗?!
[code]/**
++ 方法:Array.remove(dx)
++ 功能:删除数组元素.
++ 参数:dx删除元素的下标.
++ 返回:在原数组上修改数组
++
++ 使用:a = ['1','2','3','4','5'];
++ alert("elements: "+a+"\nLength: "+a.length);
++ a.remove(0); //删除下标为0的元素
++ alert("elements: "+a+"\nLength: "+a.length);
*/
//通过遍历,重构数组.
Array.prototype.remove=function(dx)
{
if(isNaN(dx)||dx>this.length){return false;}
for(var i=0,n=0;i<this.length;i++)
{
if(this[i]!=this[dx])
{
this[n++]=this[i]
}
}
this.length-=1
}
[/code] 事实上,“lmhllr”版主的算法功能和我的代码的第一个函数是一样的,都是删除数组中指定下标的元素值。我已经有1年多没有体会过编程了。呵呵。不过现在又燃起了对编程的热情。呵呵。希望大家以后多多交流。 学习哟~~ 好方法~
回复 5# 的帖子
这是扩展数组里的一个方法,JS的数组操作太弱了,要自己扩展好多....说句实话:这里太冷清了,根本燃不起那个热情....说句不好听的,很多时候是责任 谢谢大家的!帮助! [quote][bo]以下是引用 [un]编程之星[/un] 在 2008-3-28 10:28 的发言:[/bo]
昨晚刚看楼主这道问题的时候,我觉得非常easy,甚至有点不屑一顾,于是我就开始写代码想来解决楼主的这个问题了。
但是当我写好代码调试的时候,那些结果总是不堪入目,后来用过不少方法去试验,但是都不是想要的结果,这才发现
原 ... [/quote]
不要意思,网址打错了,是
http://www.prototypejs.org/ [quote][bo]以下是引用 [un]lmhllr[/un] 在 2008-3-28 11:49 的发言:[/bo]
/**
++ 方法:Array.remove(dx)
++ 功能:删除数组元素.
++ 参数:dx删除元素的下标.
++ 返回:在原数组上修改数组
++
++ 使用:a = ['1','2','3','4','5'];
++ alert("elements: "+a+"\nLength: "+a.lengt ... [/quote]
即时是按你的思路遍历的来做,这样的效率也太低了~~~~复杂度是O(n)
完全可以以移动数组的方式来做(即从第dx位开始移动)
另外,对于楼主的问题,没有什么解决方法,也不要去删除元素了,Prototype的做法就是,重新把非重复的元素赋值给一个新数组,简单用Prototype的语法,即
var new_arr=[];
arr.each(function(p) {
new_arr.concat(new_arr.include(p)?[]:[p]);
});
而Prototype的相关实现方法如下
var Enumerable = {
each: function(iterator) {
var index = 0;
try {
this._each(function(value) {
try {
iterator(value, index++);
} catch (e) {
if (e != $continue) throw e;
}
});
} catch (e) {
if (e != $break) throw e;
}
return this;
},
include: function(object) {
var found = false;
this.each(function(value) {
if (value == object) {
found = true;
throw $break;
}
});
return found;
},
inject: function(memo, iterator) {
this.each(function(value, index) {
memo = iterator(memo, value, index);
});
return memo;
},
// more sth else
}
Object.extend(Array.prototype, Enumerable);
if (!Array.prototype._reverse)
Array.prototype._reverse = Array.prototype.reverse;
Object.extend(Array.prototype, {
_each: function(iterator) {
for (var i = 0, length = this.length; i < length; i++)
iterator(this[i]);
},
// more sth else
uniq: function() {
return this.inject([], function(array, value) {
return array.include(value) ? array : array.concat([value]);
});
},
//more sth else.
});
更多细节请参加Prototype 1.5源码 昨晚我遇到一个高手也和他在讨论这个问题。谁知道他只是几分钟之后就写了一段代码给我,原理也是遍历数组的,但代码精炼。运行效率应该也可以接受。高手啊。下面和大家分享一下他的这段代码。稍微做了一些简单的修改。
<script>
var Arr1=['1','2','2','3','2','3','2','5'];
var Arr2 = new Array();
var isHave; //判断Arr2数组中是否存在Arr1数组中的数组元素
for(var i=0,j=Arr1.length;i<j;i++)
{
isHave = false;
for(var x=0,y=Arr2.length; x<y; x++)
{
if(Arr1[i] == Arr2[x])
{
isHave = true;
break;
}
}
if(!isHave)
{
Arr2.push(Arr1[i]);
}
}
alert(Arr2);
</script> 顶!学习了! 今天粗略地查看了一下Javascript资料,才发现Javascript里面原来有个delete运算符用来删除对象的属性或者数组的元素的。原来自己对于Javascript还有很多不懂的。- -||
于是就想到了拿delete运算符来解决删除数组中重复的元素这个问题,尝试了一下,原来还真行。而且代码还是相当的简单。所以呢,大家要将Javascript学得更加全面一点,这样就不会将简单的问题复杂化了。
代码如下:
<script language="Javascript">
var arr=new Array(5,5,2,3,1,5,2,6,6,5,2,3,8);
for(i=0;i<arr.length;i++)
{
for(j=i+1;j<arr.length;j++)
{
if(arr[j]==arr[i])
{
delete arr[j]; //用delete运算符删除重复的数组元素
}
}
}
for(i=0;i<arr.length;i++)
{
//用delete运算符删除了数组中的元素后,该元素值就成了undefined
if(arr[i]!=undefined)
{
document.writeln(arr[i]); //输出结果
}
}
</script> [quote][bo]以下是引用 [un]编程之星[/un] 在 2008-4-16 15:03 的发言:[/bo]
今天粗略地查看了一下Javascript资料,才发现Javascript里面原来有个delete运算符用来删除对象的属性或者数组的元素的。原来自己对于Javascript还有很多不懂的。- -||
于是就想到了拿delete运算符来解决删除数组中重 ... [/quote]
变成了undefiend,然后呢???照样不是位子空在那里~~~
难道在这里的人就不会真正的去学下高效和出色的代码???
我都明确的说了,Prototype框架Array对象的uniq方法~~
orz~~你们继续视而不见吧 不好意思,惭愧,惭愧,呵呵
页:
[1]
