开发者问题收集

编写一个函数()返回所有元素和数组(包括嵌套数组)的数量?

2023-01-26
151

使用递归和三元运算符。如果您能解释一下它的安排,我将不胜感激。

 console.log (deepCount([]));
0
 console.log (deepCount([1 ,2 ,3]));
3
 console.log (deepCount(["x", "z", ["y"]]));
4
 console.log (deepCount([1, 2,[3, 4,[5]]]));
7
 console.log (deepCount([[[[]]]]));
3   

let arr = [1, 2, [3, 4[5]]];

function deepCount(arr) {
  let result = arr.length;
  for (const char of arr) {
    if (Array.isArray(arr[char])) {
      result += arr[char];
      deepCount(arr);
    }
    return result;
  };    
2个回答

询问:使用 递归 三元运算符

就我而言(除了 Barmar 的评论外),您的第一个错误是没有缩进代码:这是检查括号奇偶校验的简单方法。当然,我推荐 Whitesmiths 风格

K&R 和其他带有“埃及括号”的风格不适合进行此检查...

console.log( deepCount( []                ));     // --> 0
console.log( deepCount( [1 ,2 ,3]         ));    // --> 3
console.log( deepCount( ["x", "z", ["y"]] ));   // --> 4
console.log( deepCount( [1, 2,[3, 4,[5]]] ));  // --> 7
console.log( deepCount( [[[[]]]]          )); // --> 3   

function deepCount( arr )
  {
  let count = arr.length;
  for (const elm of arr) 
    {
    count += Array.isArray(elm) ? deepCount(elm) : 0;
    }
  return count;
  }

The same, in a "single" line of code:

const deepCount = arr =>
  arr.reduce((N,x)=>N+=(Array.isArray(x)?deepCount(x):0),arr.length);

console.log( deepCount( []                ));     // --> 0
console.log( deepCount( [1 ,2 ,3]         ));    // --> 3
console.log( deepCount( ["x", "z", ["y"]] ));   // --> 4
console.log( deepCount( [1, 2,[3, 4,[5]]] ));  // --> 7
console.log( deepCount( [[[[]]]]          )); // --> 3   
Mister Jojo
2023-01-26
  1. 当您使用 for-of 时,迭代变量是数组元素,而不是其索引。因此,您应该使用 char ,而不是 arr[char] 。我已将 char 重命名为 element ,因为它与字符无关。
  2. 您需要将递归调用返回的值添加到 result ,而不是将数组元素添加到其中。
  3. return result 不应位于循环内部,而应位于末尾。
function deepCount(arr) {
  let result = arr.length;
  for (const element of arr) {
    if (Array.isArray(element)) {
      result += deepCount(element);
    }
  };
  return result;
}

console.log(deepCount([]));
console.log(deepCount([1, 2, 3]));
console.log(deepCount(["x", "z", ["y"]]));
console.log(deepCount([1, 2, [3, 4, [5]]]));
console.log (deepCount([[[[]]]]));
Barmar
2023-01-26