【问题标题】:Remove redundant directions from array using reduce method in javascript使用javascript中的reduce方法从数组中删除冗余方向
【发布时间】:2020-10-27 03:59:21
【问题描述】:

我有一个问题,我应该从数组中删除多余的方向。例如,如果我有 ["N", "S", "E", "W", "E"],我会返回 ["E"],因为南北抵消,东西抵消离开一个东。如果它们是相邻的,它们就会抵消。如果我有 ['W', 'N', 'S', 'E', 'N'],它返回 ["N"] 因为 N,S 取消,留下 W, E 也取消。我创建了一个有效的函数:

function mapQuest(arr) {
  const directions = { N: 2, S: -2, W: 1, E: -1 };

  for (let i = 0; i < arr.length; i++) {
    while (directions[arr[i]] + directions[arr[i + 1]] == 0) {
      arr.splice(i, 2);
      i = 0;
    }
  }
  return arr;
}

但问题是要求在 javascript 中使用 reduce 方法解决问题。我开始写一篇:

function mapQuest(arr) {
  let result = arr.reduce((acc, dir) => acc[dir]++, { N: 0, S: 0, W: 0, E: 0 });
}

但我不知道从这里去哪里以及如何在没有 for 循环遍历 i 的情况下仅取消相邻方向。如果有人可以帮忙,那就太好了。谢谢!

【问题讨论】:

    标签: javascript arrays methods reduce


    【解决方案1】:

    您可以检查数组中是否存在相反的左侧。如果有,只需splice 即可。如果不是,则将当前方向推入 Array:

    function mapQuest(arr) {
      const opposites = { N: 'S', S: 'N', W: 'E', E: 'W' };
      return arr.reduce((acc, dir) => {
        const oppositeIndex = acc.indexOf(opposites[dir]);
        if (oppositeIndex > -1) {
          acc.splice(oppositeIndex, 1);
        } else {
          acc.push(dir);
        }
        return acc;
      }, []);
    }
    
    console.log(mapQuest(["N", "S", "E", "W", "E"])); // ["E"]
    console.log(mapQuest(['W', 'N', 'S', 'E', 'N'])); // ["N"]

    【讨论】:

    • 等等!我在第一个版本中犯了一个大错误。修复它(我没有给splice方法提供索引,而是方向字符串)
    【解决方案2】:

    试试这个:

    let arr = ['W', 'N', 'S', 'E', 'N'];
        
        let result = arr.reduce((acc, cur) => {
            if(acc.toCancel.length === 0){
                acc.toCancel.push(cur);
                acc.result = cur;
                return acc;
            }else{
                let pair = `${acc.toCancel[0]}${cur}`;
                if(acc.pairs.includes(pair)){
                    acc.toCancel = [];
                    acc.result = cur === acc.result? "":acc.result;         
                }
                return acc;
            }
        },{toCancel:[], result:"", pairs:["EW", "NS", "WE", "SN"]});
        
        console.log(result);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-02
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      相关资源
      最近更新 更多