使用reduce缩短数组

时间:2015-12-30 19:09:14

标签: javascript

使用reduce查找项目在数组中的次数。 该数组可以递归地包含数组。

var foo = [
  1,
  [2, 3, 4], 
  4, [5,6,7], 4
];

bar(foo, 4)将返回3.

5 个答案:

答案 0 :(得分:4)

您可以使用Array.prototype.forEach()

进行一次通话来计算所有项目
  

forEach()方法每个数组元素执行一次提供的函数。

检查元素是否为数组,然后使用数组作为参数再次调用该函数。

var foo = ["a", ["b", "c", "d"], "a"],
    object = {};

function count(a, o) {
    a.forEach(function (b) {
        if (Array.isArray(b)) {
            count(b, o);
        } else {
            o[b] = (o[b] || 0) + 1;
        }
    })
}

count(foo, object);
document.write('<pre>' + JSON.stringify(object, 0, 4) + '</pre>');

答案 1 :(得分:4)

使用Array.prototype.reduce尝试此操作。

var foo = [1, [2, 3, 4], 4, [5, 6, 7], 4];

function f(arr, item) {
  return arr.reduce(function (s, i) {
    if (Array.isArray(i)) return s+f(i, item);
    return s+(i==item?1:0);
  }, 0);
}

console.log(f(foo, 4))

函数f是一个递归函数。我们遍历所有项目并将它们减少到一个数字。该函数也将在所有内部数组上调用,对于非数组项,我们只检查它们是否等于所需的项。

答案 2 :(得分:2)

所以,如果你想要一个递归(并且它可以在任何浏览器中工作):

array(
    0 => array(
        0 => 0, 
    ),   
    1 => array( 
        0 => 1, 
    ),
    2 => array(
        0 => 2,
    )
)

答案 3 :(得分:2)

这是另一种不需要外部状态的功能类型的解释,但效率会更低。

[EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]
public class MyController: ApiController
{
    ...
}
var foo = [
  "a",
  ["b", "c", "d"],
  ["a", "b"],
  "a"
];

function flatten( arr ){
  return arr.reduce(function( ret, curr ){
    return ret.concat( Array.isArray( curr ) ? flatten( curr ) : [ curr ] );
  }, []);
}

function filterBy( arr, val ){
  return arr.filter(function( item ){
    return item === val;
  })
}

console.log( flatten( foo ) );
console.log( filterBy( flatten( foo ), 'a') );

答案 4 :(得分:1)

使用underscore,您可以使用以下代码计算每个元素的出现次数:

_.countBy(_.flatten(array), _.identity)

所以函数foo可以像这样实现:

function bar(foo, element){
    return _.countBy(_.flatten(foo), _.identity)[element];
}
var foo = ["a", ["b", "c", "d"], "a"]
console.log(bar(foo, "a"));

虽然这个解决方案不是递归的,但我觉得值得一提。