标题:JS筛选
只看楼主
kevintang
Rank: 4
等 级:业余侠客
威 望:9
帖 子:799
专家分:236
注 册:2008-2-14
结帖率:80%
 问题点数:0 回复次数:14 
JS筛选
js 中的数组怎么取出没有相同的记录啊
  比如 一个数组 var s =[1,2,4,5,6,7,7,8,8,2,3,4]
我现在要得结果是[1,2,4,5,6,7,8,3]
求救~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
搜索更多相关主题的帖子: 筛选 var 记录 结果 
2008-03-27 20:04
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
得分:0 
去看看Prototype框架,Array模块的uniq方法
www.

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

[[it] 本帖最后由 渚薰 于 2008-3-28 08:46 编辑 [/it]]

个人ajax技术专题站: " target="_blank">http://www. 我不会闲你烦,只会闲你不够烦!
2008-03-28 08:42
编程之星
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:285
专家分:391
注 册:2007-4-10
得分:0 
昨晚刚看楼主这道问题的时候,我觉得非常easy,甚至有点不屑一顾,于是我就开始写代码想来解决楼主的这个问题了。
但是当我写好代码调试的时候,那些结果总是不堪入目,后来用过不少方法去试验,但是都不是想要的结果,这才发现
原来我一直都没有遇到过这样的问题,以前倒是遇到过删除列表项中重复的选项的,但是列表框的起码也有个Remove()
方法来操作。于是我就翻阅Javascript的资料,OH NO!原来Javascript的数组没有删除数组元素的方法。于是,自己就
写代码,但是可能开始时候自己的思路就错了吧,于是就一直将错就错,昨晚直到错到自己都有点灰心了,于是当时就
唯有等待改天看高手如何帮楼主的解答了。
还好今早我一早醒了突然思路就清晰了!看来算法不应该在电脑前去思考,呵呵。
(想说一句的是,楼上的斑竹,我怎么打不开www.,或者说里面没内容)
于是就有了下面的代码:
<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>
收到的鲜花
  • lmhllr2008-03-28 12:52 送鲜花  5朵   附言:敬佩您的认真

怎么越学就觉得自己越笨
2008-03-28 10:28
lmhllr
Rank: 8Rank: 8
等 级:贵宾
威 望:44
帖 子:1504
专家分:42
注 册:2005-5-12
得分:0 
删除数组中的元素?!我这里有个,算吗?!
程序代码:
/**
++  方法: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
}
2008-03-28 11:49
编程之星
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:285
专家分:391
注 册:2007-4-10
得分:0 
事实上,“lmhllr”版主的算法功能和我的代码的第一个函数是一样的,都是删除数组中指定下标的元素值。我已经有1年多没有体会过编程了。呵呵。不过现在又燃起了对编程的热情。呵呵。希望大家以后多多交流。

怎么越学就觉得自己越笨
2008-03-28 11:59
luyihuaa5201
Rank: 2
等 级:论坛游民
帖 子:254
专家分:10
注 册:2007-3-25
得分:0 
学习哟~~   好方法~
2008-03-28 12:38
lmhllr
Rank: 8Rank: 8
等 级:贵宾
威 望:44
帖 子:1504
专家分:42
注 册:2005-5-12
得分:0 
回复 5# 的帖子
这是扩展数组里的一个方法,JS的数组操作太弱了,要自己扩展好多....

说句实话:这里太冷清了,根本燃不起那个热情....说句不好听的,很多时候是责任
2008-03-28 12:51
kevintang
Rank: 4
等 级:业余侠客
威 望:9
帖 子:799
专家分:236
注 册:2008-2-14
得分:0 
谢谢大家的!帮助!
2008-03-29 12:36
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
得分:0 
[bo]以下是引用 [un]编程之星[/un] 在 2008-3-28 10:28 的发言:[/bo]

昨晚刚看楼主这道问题的时候,我觉得非常easy,甚至有点不屑一顾,于是我就开始写代码想来解决楼主的这个问题了。
但是当我写好代码调试的时候,那些结果总是不堪入目,后来用过不少方法去试验,但是都不是想要的结果,这才发现
原 ...


不要意思,网址打错了,是
http://www.

个人ajax技术专题站: " target="_blank">http://www. 我不会闲你烦,只会闲你不够烦!
2008-03-31 09:12
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
得分:0 
[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 ...


即时是按你的思路遍历的来做,这样的效率也太低了~~~~复杂度是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技术专题站: " target="_blank">http://www. 我不会闲你烦,只会闲你不够烦!
2008-03-31 09:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-205718-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.535573 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved