【问题标题】:Javascript all in one function to find value in arrayJavascript多合一功能在数组中查找值
【发布时间】:2017-05-27 15:00:34
【问题描述】:

我尝试了 2 天,但没有运气!哈哈

我的菜鸟问题是

我有一个容器

var container = [1.29,1.30,1.20,1.21,1.95,4.19,1.53,4.11,1.06,84.64,0,23.1,1,22,1.22];

所以,我需要找到一个快速的解决方案来查看这个容器并计算值,我只需要遵守 2 条规则 如果我必须计算的值是 0,我需要确切知道容器中有多少个 0 如果该值不是 0,我需要计算所有等于或大于该值的值

所以我尝试了这两种方法,但在这两种情况下,我都得到了错误的 0 值结果。

function count(arr, value) {
   if (arr.length === 1) {
      return arr[0] === value ? 1 : 0;
   } else {
     if (value === 0) {
       return (arr.shift() === value ? 1 : 0) + count(arr, value);
     } else {
       return (arr.shift() >= value ? 1 : 0) + count(arr, value);
     }
   }
}

console.log(count(container, 2));
console.log(count(container, 0));

我的期望是找到所有值 >= 的 2 和所有值 === 0 但是我得到了 2 的正确结果和 0 的错误结果

同一个函数的这 2 个变体相同

function isBigEnough(value) {
  return function(element, index, array) {
    if (value === 0) {
      return (element = value);
    } else {
      return (element >= value);
    }
  }
}

function isBigEnough(value) {
  if (value === 0) {
    return function(element, index, array) {
      return (element = value);
    }
  } else {
    return function(element, index, array) {
      return (element >= value);
    }
  }
}

每次我得到 0 值的 0 结果,但容器中有 1。

有什么想法吗? 更快速的方法是什么?

非常感谢,祝你有美好的一天。

【问题讨论】:

  • 使用shift() 没有意义,除非您循环遍历数组
  • 查看array.reduce。这将是辉煌的。
  • @charlietfl,问题是shift 方法像我的回答一样修改了原始数组。

标签: javascript arrays function filter


【解决方案1】:

您可以使用filter 方法获得更智能的解决方案。

filter 方法通过为数组中的每个项目应用提供的 回调 函数来创建一个新数组。

如果您使用的是ES6,请尝试arrow 函数。

var container = [1.29,1.30,1.20,1.21,1.95,4.19,1.53,4.11,1.06,84.64,0,23.1,1,22,1.22];
function count(arr, value) {
   if(value==0)
    return arr.filter(a=>a==0).length;
   return arr.filter(a=>a>=value).length;  
}
console.log(count(container, 2));
console.log(count(container, 0));

你的函数有什么问题?

问题是shift方法修改了原始数组,这就是你在调用值为0的函数时得到0结果的原因。请看下面的sn-p。

var container = [1.29,1.30,1.20,1.21,1.95,4.19,1.53,4.11,1.06,84.64,0,23.1,1,22,1.22];
function count(arr, value) {
   if (arr.length === 1) {
      return arr[0] === value ? 1 : 0;
   } else {
     if (value === 0) {
       return (arr.shift() === value ? 1 : 0) + count(arr, value);
     } else {
       return (arr.shift() >= value ? 1 : 0) + count(arr, value);
     }
   }
}
console.log(count(container, 2));
console.log(container);
console.log(count(container, 0));

要解决这个问题,您必须使用 copy 以便在每次需要时调用 count 函数。

【讨论】:

  • count all value equal or greater 你可能想使用a >= value
  • 谢谢!我认为这是我需要的最快的方法,非常简单
【解决方案2】:

使用reduce,几乎是一个衬里。

var container = [1.29,1.30,1.20,1.21,1.95,4.19,1.53,4.11,1.06,84.64,0,23.1,1,22,1.22];

let zeroes = 0;

let result = container.reduce(function(a,b){
  if (!b)
  {
    zeroes++;
  }
  return a + b;
}, 0);

console.log(result, zeroes);

【讨论】:

  • 为什么不从一个对象开始reduce,一个属性用于零计数,另一个用于值计数。那么你就不需要一个全局变量了。
  • @ste2425 我想这也可以。只是取决于他们想如何使用它。
【解决方案3】:

你可以检查value,应该使用哪个函数。

function count(arr, value) {
    return arr.filter(value ? a => a >= value : a => a === 0).length;
}

var container = [1.29, 1.30, 1.20, 1.21, 1.95, 4.19, 1.53, 4.11, 1.06, 84.64, 0, 23.1, 1, 22, 1.22];

console.log(count(container, 2));
console.log(count(container, 0));

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2021-03-03
    • 2015-08-27
    • 1970-01-01
    • 2022-11-15
    • 2013-04-17
    相关资源
    最近更新 更多