array.push()方法抛出TypeError

时间:2016-12-19 15:57:57

标签: javascript arrays

我正在尝试使用array.map()来实施array.reduce()。这是我到目前为止所做的:

function arrayMap(arr, fn) {
    return arr.reduce(function(a, elem) {
        return a.push(fn(elem));
    }, []);
}

let x = arrayMap([1, 2, 3], function(elem) {
    return elem * 2;
});

console.log(x);

但是翻译给了我:

  

TypeError:a.push不是函数

即使提供累加器'a'以作为空数组减少。

3 个答案:

答案 0 :(得分:3)

Array#push方法返回数组的长度,并返回长度。所以在下一次迭代中,a将是一个数字(1)而不是数组。

要使其工作,您需要返回数组引用。

function arrayMap(arr, fn) {
    return arr.reduce(function(a, elem) {
        a.push(fn(elem));
        return  a;
    }, []);
}



function arrayMap(arr, fn) {
  return arr.reduce(function(a, elem) {
    a.push(fn(elem));
    return a;
  }, []);
}

let x = arrayMap([1, 2, 3], function(elem) {
  return elem * 2;
});

console.log(x);




实际上,Array#reduce方法使其更复杂,更好的想法是使用Array#map方法。

function arrayMap(arr, fn) {
    return arr.map(fn);
}



function arrayMap(arr, fn) {
  return arr.map(fn);
}
let x = arrayMap([1, 2, 3], function(elem) {
  return elem * 2;
});

console.log(x);




答案 1 :(得分:3)

改为使用Array.concat()

function arrayMap(arr, fn) {
    return arr.reduce(function(a, elem) {
        return a.concat(fn(elem));
    }, []);
}

let x = arrayMap([1, 2, 3], function(elem) {
    return elem * 2;
});

console.log(x); // [2, 4, 6]

答案 2 :(得分:0)

您可以使用Array.prototype.reduce()的参数currentIndex,{{3}}是数组中正在处理的当前元素的索引。如果提供了initialValue,则从索引0开始,否则从索引1开始。



function arrayMap(arr, fn) {
  return arr.reduce(function(a, elem, currentIndex) {
    a[currentIndex] = fn(elem);
    return a;
  }, []);
}

let x = arrayMap([1, 2, 3], function(elem) {
  return elem * 2;
});

console.log(x);