Directions Reduction

题目描述

Write a function which will take an array of strings and return an array of strings with the needless directions removed (WEST and EAST, NORTH and SOUTH cancel each other out).
If everything cancels out, return an empty array (stay in place);

For example:

dirReduc([“NORTH”, “SOUTH”, “SOUTH”, “EAST”, “WEST”, “NORTH”, “WEST”]) => [“WEST”]
dirReduc([“NORTH”, “SOUTH”, “SOUTH”, “EAST”, “WEST”, “NORTH”]) => []

我的代码

function dirReduc(arr){
  // ...
  for(i=0; i<arr.length; i++){
    if(arr[i] == "NORTH"){
      arr[i] = 1;
    }else if(arr[i] == "SOUTH"){
      arr[i] = -1;
    }else if(arr[i] == "EAST"){
      arr[i] = 2;
    }else if(arr[i] == "WEST"){
      arr[i] = -2;
    }
  }
//   console.log(arr);
  for(i=0; i<arr.length; i++){  
      if(arr[i] + arr[i+1] == 0){
        arr.splice(i,2);
        i -=2;
        continue;
      } 
  }
  for(i=0; i<arr.length; i++){
    if(arr[i] == 1){
      arr[i] = "NORTH";
    }else if(arr[i] == -1){
      arr[i] = "SOUTH";
    }else if(arr[i] == 2){
      arr[i] = "EAST";
    }else if(arr[i] == -2){
      arr[i] = "WEST";
    }
  }
  return arr;
}

Clever

function dirReduc(arr) {
 var str = arr.join(''), pattern = /NORTHSOUTH|EASTWEST|SOUTHNORTH|WESTEAST/; 
 while (pattern.test(str)) 
  str = str.replace(pattern,'');
 return str.match(/(NORTH|SOUTH|EAST|WEST)/g)||[]; 
}

Key

  • 如何考虑重复判断数组arr里是否还有符合要求的字符对?
    解决办法:下标i回到0,跳出当前循环,又从第一个元素开始判断剩余数组中的内容,重复这个过程,直到没有符合条件的元素

  • 删除的数组的某一项用:splice(index,len,[item])   
    注:该方法会改变原始数组
    splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值
    index:数组开始下标(要删除的元素的下标)   
    len: 替换/删除的长度      
    item:替换的值,删除操作的话 item为空

-------------完-------------