学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
轻松建立自己的群组,招兵买马   
 15 12
发新话题
打印

JS筛选

JS筛选

js 中的数组怎么取出没有相同的记录啊
  比如 一个数组 var s =[1,2,4,5,6,7,7,8,8,2,3,4]
我现在要得结果是[1,2,4,5,6,7,8,3]
求救~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

TOP

去看看Prototype框架,Array模块的uniq方法
www.prototypejs.com

原理是很简单的,就是用一个新数组来返回结果,遍历旧数组,往里面加数据,每次加数据都判断新数组里是否有该数据

[ 本帖最后由 渚薰 于 2008-3-28 08:46 编辑 ]
个人ajax技术专题站: http://www.ajaxgo.org 我不会闲你烦,只会闲你不够烦!

TOP

昨晚刚看楼主这道问题的时候,我觉得非常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>
本帖最近评分记录
  • lmhllr 金币 +5 敬佩您的认真 2008-3-28 12:52
沉静了一段时间,编程水平又退步了,快点快马加鞭......

TOP

删除数组中的元素?!我这里有个,算吗?!

复制内容到剪贴板
代码:
/**
++  方法: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
}

TOP

事实上,“lmhllr”版主的算法功能和我的代码的第一个函数是一样的,都是删除数组中指定下标的元素值。我已经有1年多没有体会过编程了。呵呵。不过现在又燃起了对编程的热情。呵呵。希望大家以后多多交流。
沉静了一段时间,编程水平又退步了,快点快马加鞭......

TOP

学习哟~~   好方法~

TOP

回复 5# 的帖子

这是扩展数组里的一个方法,JS的数组操作太弱了,要自己扩展好多....

说句实话:这里太冷清了,根本燃不起那个热情....说句不好听的,很多时候是责任

TOP

谢谢大家的!帮助!

TOP

引用:
以下是引用 编程之星 在 2008-3-28 10:28 的发言:

昨晚刚看楼主这道问题的时候,我觉得非常easy,甚至有点不屑一顾,于是我就开始写代码想来解决楼主的这个问题了。
但是当我写好代码调试的时候,那些结果总是不堪入目,后来用过不少方法去试验,但是都不是想要的结果,这才发现
原 ...
不要意思,网址打错了,是
http://www.prototypejs.org/
个人ajax技术专题站: http://www.ajaxgo.org 我不会闲你烦,只会闲你不够烦!

TOP

引用:
以下是引用 lmhllr 在 2008-3-28 11:49 的发言:


/**
++  方法:Array.remove(dx)
++  功能:删除数组元素.
++  参数:dx删除元素的下标.
++  返回:在原数组上修改数组
++  
++  使用:a = ['1','2','3','4','5'];
++        alert("elements: "+a+"\nLength: "+a.lengt ...
即时是按你的思路遍历的来做,这样的效率也太低了~~~~复杂度是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源码
个人ajax技术专题站: http://www.ajaxgo.org 我不会闲你烦,只会闲你不够烦!

TOP

 15 12
发新话题