递归循环数组并返回项目数?

时间:2016-03-08 18:01:18

标签: javascript arrays recursion

如果之前有人问我,我很抱歉,但我找不到答案。如何在具有嵌套数组的数组中循环并在控制台中打印出项目出现的实例数?

所以console.log应该打印出名称的数字2" bob"因为" bob"在数组中出现两次。

这是我的阵列和我到目前为止所拥有的:



    var names = ["bob", ["steve", "michael", "bob", "chris"]];

    function loop(arr, item) {
      for (var i = 0; i < arr.length; i++) {
        if (arr[i] instanceof Array) {
          loop(arr[i], item);
        } else {
          if (arr[i] == item) {
            console.log(arr[i]);
          }
        }
      }
    }

    loop(names, "bob");
&#13;
&#13;
&#13;

6 个答案:

答案 0 :(得分:5)

在这里,请注意,您可以在内部保留计数器值,以使代码的其余部分更清晰:

var names = ["bob", ["steve", "michael", "bob", "chris"]];

function loop(arr, item) {
  var result = 0;
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] instanceof Array) {
      result += loop(arr[i], item);
    } else {
      if (arr[i] == item) {
        result++;
      }
    }
  }
  return result;    
}


var result = loop(names, "bob");
console.log(result);

答案 1 :(得分:3)

你需要一个计数器

function loop(arr, item) {
    var count = 0;
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] instanceof Array) {
            count += loop(arr[i], item);
        } else {
            if (arr[i] == item) {
                count++;
                console.log(arr[i]);
            }
        }
    }
    return count;
}

var names = ["bob", ["steve", "michael", "bob", "chris"]],
    count = loop(names, "bob");

document.write(count);

答案 2 :(得分:3)

您也可以使用reduce

var names = ['bob', ['steve', 'michael', 'bob', 'chris', ['bob']]];

function count(item, items) {
  return items.reduce(function(sum, x) {
    if (Array.isArray(x)) return sum + count(item, x);
    if (x === item) return sum + 1;
    return sum;
  }, 0);
}

count('bob', names); // => 3

另一个选择是使用更多通用函数并将它们链接在一起。

  1. 展平输入数组; [1,[2,3,4,5,[6]]] =&gt; [1,2,3,4,5,6]
  2. 过滤每个元素与搜索元素匹配的扁平数组
  3. 返回已过滤数组的长度
  4. 看起来像这样

    flatten(names).filter(x => x === 'bob').length
    

    我将flatten的实施作为练习

答案 3 :(得分:0)

纯粹的递归形式,无需外部变量。

尝试修改您的逻辑,如下所示,

<击>

<击>
var names = ["bob", ["steve", "michael", "bob", "chris",["bob"]]];
function loop(arr, item, cnt){
   cnt = cnt || 0;
   for(var i = 0; i < arr.length; i++){
     if(arr[i]==item){ cnt++; }
     else if(arr[i] instanceof Array) { return loop(arr[i], item, cnt); } 
   }
   return cnt;
}

loop(names,"bob"); //3

<击>

var names = ["bob", ["steve", "michael", "bob", "chris", ["bob"],["bob",["bob"]]], "bob"];

function find(arr, txt, cnt, match) {
  cnt = cnt || 0;
  match = match || 0;
  if (arr[cnt] === txt) { match++; } 
  else if (arr[cnt].push) { match = find(arr[cnt], txt, 0, match); } 
  if (++cnt === arr.length) { return match; }
  return find(arr, txt, cnt, match);
}

alert(find(names, "michael")); //6

答案 4 :(得分:0)

const names = ["bob", ["steve", "michael", "bob", "chris"]];

function loop(arr, item) {
    let res = 0;

    for (let v of arr) {
        if (typeof v === 'object') res += loop(v, item);
        if (v === item) res++;
    }

    return res;    
}



const result = loop(names, "bob");
console.log(result);

答案 5 :(得分:0)

截止2020年,我们采用了Array.prototype.flat方法,使这项任务变得微不足道。

你在这里。

const names = ["bob", ["steve", "michael", "bob", "chris"]];
const nestedNames = ["bob", ["steve", ["michael", ["bob", ["chris"]]]]];

function countName(array, name, depth = Infinity) {
  return array.flat(depth).reduce((acc, cur) => acc + (cur === name ? 1 : 0), 0);
}

console.log(countName(names, 'bob')); // 2
console.log(countName(names, 'chris')); // 1

console.log(countName(nestedNames, 'bob')); // 2
console.log(countName(nestedNames, 'chris')); // 1