【问题标题】:Cannot reduce array inside of an object无法减少对象内部的数组
【发布时间】:2015-09-22 17:58:19
【问题描述】:

我正在尝试减少对象内部的数组。我要回来了

push is not a function 

我已经将我的数组作为空数组开始,并创建了一个添加函数作为第一个参数传入。

function add(a,b) {
        return a +b;
}

var navBarArray = [];
var listArray = [];

var mapping = {
  ".navbar": navBarArray,
  ".list-group": listArray
};

我在映射对象上尝试了这种方法,但它会产生错误

var mapping = {
  ".navbar": Math.round(navBarArray.reduce(add,0) ),
  ".list-group": listArray
};

但是,我得到 push is not a function back in my console。

下面是我将值传递给数组的函数。我可以在函数内部创建一个变量并在那里减少它。但是,这会限制对我的变量的访问,并且会在我继续时使我的函数膨胀。

  Object.keys(mapping).forEach(function(selector) { 
      $(selector).hover(function(evt) {
        console.log('mapping',mapping);
        console.log('selector',selector);
        enteredTime = new Date();
      }, function() {
        var ctime = new Date();
        var time = (ctime.getTime() - enteredTime.getTime())/1000;
        mapping[selector].push(time);

        // *********** this works but not where I need it to*******
        var reduce = Math.round(navBarArray.reduce(add,0) );
        console.log(reduce);
        });
    })

【问题讨论】:

  • 也许mapping[selector]undefined...?
  • 哪一行出现错误?调用reduce应该不会报关于push的错误。
  • 也许确保mapping[selector]typeof "array"
  • reduce 的结果在您的情况下不是数组。而且还不清楚你想要它实际上是什么。
  • 第二个var mapping = ... sn-p 将.navbar 键的值设置为一个数字,但随后您尝试像使用mapping[selector].push(...) 的数组一样使用它。我认为你只需要坚持mapping 的第一个定义。

标签: javascript arrays scope reduce


【解决方案1】:

更改您的映射对象,使其具有单独的数组和总计位置:

var mapping = {
    ".navbar": {
        total: 0,
        times: []
    },
    ".list-group": {
        total: 0,
        times: []
    }
}

然后你做mapping[selector].times.push(time),然后把总数放在:

mapping[selector].total = mapping[selector].times.reduce(add, 0);

【讨论】:

  • 谢谢!我遵循这种方法。根据我读到的内容,我无法在对象中放置 reduce。
  • 你一定是误读或误解了。 reduce 没有什么特别之处,它只是一个返回值的函数调用。您可以在对象中放置任何值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 2018-09-03
  • 2020-12-30
  • 2021-10-25
  • 2020-07-27
相关资源
最近更新 更多