【问题标题】:check previous and current element of array检查数组的前一个和当前元素
【发布时间】:2017-12-06 10:42:24
【问题描述】:

想象一下:我有一个数组:["1", "2", "X", ".", "4", "3", "Z", "-", "12"];

我考虑应该使用哪个函数:

  • 在数组中找到第一个 NaN 元素(假设索引 = 2)并检查下一个(索引 = 3)是否也是 NaN,如果是(从数组中删除索引 = 2) 的元素。

所以转换后的数组的结果应该是:["1", "2",".", "4", "3", "-", "12"];

我不想要你的代码,只是建议/帮助如何启动它。

感谢您的回复和帮助。

【问题讨论】:

  • 添加你目前拥有的代码
  • 不太明白你想问什么,你是想说过滤掉所有NaN元素吗?
  • @Dean 过滤所有NaN 当且仅当数组的下一个元素本身不是数字。
  • @FedericoklezCulloca 非常兴奋。我想知道为什么我对这个问题有-5...这有什么问题?
  • @Ernesto 问题是你自己没有表现出任何努力来解决这个问题,这在这里是不受欢迎的。因此投反对票。

标签: javascript arrays ecmascript-6


【解决方案1】:

您可以只检查数组是否有以下两个 NaN 值。

var array = ["1", "2", "X", ".", "4", "3", "Z", "-", "12"],
    result = array.filter((v, i, a) => !isNaN(v) || !isNaN(a[i + 1]));

console.log(result);

【讨论】:

    【解决方案2】:

    您可以使用Array#filter 查找当前和下一个项目是否为NaN

    const data = ["1", "2", "X", ".", "4", "3", "Z", "-", "12", "END"];
    
    const result = data.filter((c, i, arr) => i + 1 === arr.length || !(isNaN(c) && isNaN(arr[i + 1])));
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      您可以使用 for 循环遍历数组并跟踪 currentprevious 元素。

      然后你可以使用 isNaN 来检查两个值是否都是NaN

      如果两者都是NaN,则可以使用splice 删除索引i-1 处的项目(相当于previous):

      arr = ["1", "2", "X", ".", "4", "3", "Z", "-", "12"];
      
      var previous = null;
      for (var i = 0; i < arr.length; i++) {
        var current = arr[i];
        if(isNaN(previous) && isNaN(current)) {
           arr.splice(i-1, 1);
        }
        previous = current;
      }
      
      console.log(arr); //[ '1', '2', '.', '4', '3', '-', '12' ]

      【讨论】:

        【解决方案4】:

        你可以递归地做:

        var arr = ["1", "2", "X", ".", "4", "3", "Z", "-", "12"];
        var i = 0;
        function removeFirstNan (arr) {
          for (var i = 0; i < arr.length; i++) {
            if (isNaN(arr[i]) && isNaN(arr[i + 1])) {
              var newArr = [ ...arr.slice(0, i), ...arr.slice(i + 1, arr.length) ];
              return removeFirstNan(newArr);
            }
          }
          return arr;
        }
        
        arr = removeFirstNan(arr);
        console.log(arr);

        array.prototype.findIndex 的可读性更强:

        var arr = ["1", "2", "X", ".", "4", "3", "Z", "-", "12"];
        function removeFirstNan (arg) {
            var firstNanIndex = arg.findIndex((e, i) => (isNaN(e) && isNaN(arg[i + 1])));
            if (firstNanIndex !== -1) {
                var newArr = [ ...arg.slice(0, firstNanIndex), ...arg.slice(firstNanIndex + 1, arg.length) ];
                return removeFirstNan(newArr);
            }
            return arg;
        }
        arr = removeFirstNan(arr);
        console.log(arr);

        【讨论】:

        • 你应该提前停止循环。
        • 我忘了递归调用抱歉
        猜你喜欢
        • 1970-01-01
        • 2011-04-18
        • 2021-09-21
        • 2011-08-30
        • 2011-06-15
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        相关资源
        最近更新 更多