乐趣区

关于javascript:数组去重之新老对比法

明天没事就说说数组一个很重要的利用——数组去重。轻易在网上搜搜能搜出一堆数组去重的办法。事实比拟残暴了当然了,与大部分办法不同的是,一句一句的通知你为啥这样做。当前就不必背下来了,间接体会,轻松写出~

依据沙老师很形象的表之后,感觉这个例子十分的适合,于是借用了。这是一个大家相熟的场景,吃回转寿司。如果咱们背后有一个空盘子,这时咱们心愿吃没吃过的,开始旋转转盘时,往下拿寿司,当发现自己的盘子里的和转过来的寿司一样时,就不拿了。依照这种思路,看代码。

思路 1

首先,须要一个数组,作为一个旧数组。接着,须要一个空盘子,创立一个返回值为曾经去重之后的数组函数。

var arr = [3, 5, 2, 6, 8, 5, 7, 2];
function newArray(arr) {}
// 调用去重函数失去一个新的数组
console.log(newArray(arr));
// 然而须要把老数组作为参数传给函数,在函数里利用

既然调用函数之后失去一个新数组,那么最起码返回值要是新数组吧?所以再加一句:

function newArray(arr) {
// 在函数中筹备一个接新数组的盘子
// 并给它老数组的第一个
  var newArrayValue = [arr[0]];
// 返回新数组的盘子,盘子里此时只有老数组的第一项
  return newArrayValue;
}
console.log(newArray(arr));

思路 2

接着让寿司台(老数组)转起来看,怎么转?在函数中进行 for 循环。

// 逐个看老数组里的货色
for (var i = 1; i < arr.length; i++) {
// 不光要看老数组,还要看盘子里(新数组)的货色
// 和老数组是不是一样
  for (var j = 0; 
  j < newArrayValue.length; 
  j++){// 在这里要有一个判断的过程}
}

剖析一下判断过程,如果有一个老数组中的和新数组中的一样,就不看前面的了,因为都呈现一样的就没有必要再看前面的了。所以这时候,不看本人的盘子里了,于是跳出内循环。

if(arr[i] === newArrayValue[j]){
  // 跳出循环(不比了)break;
}

那么还有另一种可能性,就是发现自己看了一遍盘子里,没发现有一样的寿司。这时候,就须要通知大脑“拿过去!我要吃!”往数组里加货色用 push 办法。

然而!有一个问题,比拟和夹菜是两个不同的动作,尽管大脑很好用,动作很连贯,可咱们要在程序中体现,就须要按步骤进行。

判断  ——> 先存储一个数据,用于告知手行将有要加菜 
援用 ——> 再跳出本轮循环

这里, 要存储一个叫做“是否”的数据,那么在程序中“是”,“否”,咱们能够用布尔类型的值来操作。在哪加?在看完一遍老数组之后,创立一个变量,也就是在内层循环外先创立一个变量。

for (var i = 1; i < arr.length; i++) {
  // 在看完一遍老数组之后,// 创立一个 push 还是不 push 的变量
  // 叫做有反复 isRepeat,最开始定义为没有
  var isRepeat = false;
  // 把新数组也遍历一遍
  for (var j = 0; 
  j < newArrayValue.length; 
  j++) {
    // 开始逐个比拟两个数组的值
    //turu: 阐明又反复,走 if 外面
  if (arr[i]===newArrayValue[j]) {
      // 能进这里了,阐明必定反复了
      // 所以给变量从新赋值 true
      isRepeat = true;
      // 跳出循环(同时不比了)break;
    }
  }
}

这外面有一个容易错的中央就是 if(值)括号里应是 true 然而,能进去的是没反复,也就是此时 isRepeat 值为false,所以咱们将这个变量!反值解决,变成true,这时候能够夹菜了。

所有代码:

//1. 老数组
var arr = [3, 5, 2, 6, 8, 5, 7, 2];
//2. 创立一个返回值为曾经去重之后的数组函数
function newArray(arr) {
  //3. 创立一个直达的变量承接新数组的内容
  //5. 数组的值等于老数组的第一位,// 这一位必定不反复,并在里面加 [] 视为数组类型
  var newArrayValue = [arr[0]];//[3]
  //6. 遍历 arr 数组,把每一个拿进去,然而不必拿第一个了
  for (var i = 1; i < arr.length; i++) {
//12. 在看完一遍老数组之后,// 创立一个 push 还是不 push 的变量叫做有反复 isRepeat,// 最开始定义为没有
    var isRepeat = false;
    //8. 把新数组也遍历一遍
    for (var j = 0; 
    j < newArrayValue.length; 
    j++) {
 //9. 开始逐个比拟两个数组的值
//turu: 阐明又反复,走 if 外面
 if(arr[i] === newArrayValue[j]){
  //13. 能进这里了,阐明必定反复了
  isRepeat = true;
 //10. 跳出循环(同时不比了)break;
 }
}
//7. 把遍历进去的所有老数组中的元素 push 到新数组的最初面。此时
/*
11. 发现比与不比都走 push,没意义。所以,须要一个 push 还是不 push 的判断。如果,跳出了就不 push 了
*/
    //14. 能进这里阐明,没反复,// 然而 isRepeat=false,所以加!if(!isRepeat){newArrayValue.push(arr[i]);
    }
  }
  return newArrayValue;
}
//3. 调用去重函数失去一个新的数组
console.log(newArray(arr));
退出移动版