如何在一个对象属性上调用Array.reduce?

时间:2019-03-18 15:28:43

标签: javascript arrays reduce enumerable

我试图做一个

var obj = { foo: 'bar', bar: 'baz' };
Array.prototype.reduce.call(obj, function(prev, val) {
    // whatever code ...
}, []);

,但不执行任何迭代。也许是因为对象属性不可枚举?

有什么方法可以在对象上运行reduce函数?

4 个答案:

答案 0 :(得分:2)

reduce()这样的数组方法只能对数组或类似数组的对象(具有length和数字属性)进行操作。

您可以调用Object.values()来获取对象属性值的数组。

答案 1 :(得分:1)

您可以在Unsupported keyword REGEX (1): [MatchesRegex, Matches, Regex];函数返回的数组上运行reduce()方法。看起来像这样:

Object.keys()

答案 2 :(得分:1)

几个错误。

  • obj不是数组。使用.values()
  • prev.push的结果不是数组,而是push方法的结果为1(整数);
  • 没有变量可以得到最终结果。

这是一个有效的示例:

var obj = { foo: 'bar', bar: 'baz' };
var res = Array.prototype.reduce.call(Object.values(obj), function(prev, val) {
    prev.push(val);
    return prev;
}, []);
console.log(res);

我不知道您为什么使用Array.prototype.reduce.call。无需这样称呼。也许您正在尝试js之类的东西。 prev也不是一个好名字。请记住,它是累积值,而不仅仅是先前交互的值。无论如何,这是一种更简单的方法:

var obj = { foo: 'bar', bar: 'baz' };
var res = Object.values(obj).reduce((acc, val)=>{
    acc.push(val); 
    return acc;
}, []);
console.log(res);

但是,如果这是您想要的答案,则根本不需要减少。看:

var obj = { foo: 'bar', bar: 'baz' };
console.log(Object.values(obj));

答案 3 :(得分:-1)

您可以使用 Object.keys(obj)将为您提供该数组上的属性名称数组,您可以应用任何数组方法(预定义) 像这样

var obj = { foo: 'bar', bar: 'baz' };
var prev=[] //let say prev is array in which you want to store some property value

Object.keys(obj).reduce(function(element) {
    // you can have condition here as well
    prev.push(obj[element]);
});

但是要小心,如果您只想填充另一个数组,则可以使用其他数组方法,例如filter,map,forEach(仅出于学习目的,因为它类似于for循环) 这是有道理的。