如何“减少”一个对象?
How to `reduce` over an object?
我想知道如何对对象而不是数组使用某些 reduce
逻辑。类似于遍历由
表示的元组
[ object_property, property_value ]
).
我尝试了一些代码,例如
var obj = { foo: 'bar', bar: 'baz' };
Array.prototype.reduce.call(obj, function(prev, val) {
console.log('new iteration');
// whatever code ...
return prev;
}, []);
但它不执行任何迭代。我不明白为什么。
可能是因为对象属性不可枚举?
有什么方法可以 运行 对象上的 reduce 函数吗?
注:没有具体的最终目的;我正在探索什么是可能的或什么可能是更好的模式。
像reduce()
这样的数组方法只能对数组或类数组对象(具有length
和数字属性)进行操作。
您可以调用 Object.values()
来获取对象的 属性 值的数组。
您可以对 Object.keys()
函数返回的数组使用 运行 reduce()
方法。它看起来像这样:
var obj = { foo: 'fooValue', bar: 'barValue' };
var str = Object.keys(obj).reduce((accum, key)=>{
return accum + obj[key];
}, '');
// str = 'fooValuebarValue';
你可以使用
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 循环)
这是有道理的。
几个错误。
- 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);
但如果这是你想要的答案,则根本不需要reduce。看:
var obj = { foo: 'bar', bar: 'baz' };
console.log(Object.values(obj));
我想知道如何对对象而不是数组使用某些 reduce
逻辑。类似于遍历由
[ object_property, property_value ]
).
我尝试了一些代码,例如
var obj = { foo: 'bar', bar: 'baz' };
Array.prototype.reduce.call(obj, function(prev, val) {
console.log('new iteration');
// whatever code ...
return prev;
}, []);
但它不执行任何迭代。我不明白为什么。
可能是因为对象属性不可枚举?
有什么方法可以 运行 对象上的 reduce 函数吗?
注:没有具体的最终目的;我正在探索什么是可能的或什么可能是更好的模式。
像reduce()
这样的数组方法只能对数组或类数组对象(具有length
和数字属性)进行操作。
您可以调用 Object.values()
来获取对象的 属性 值的数组。
您可以对 Object.keys()
函数返回的数组使用 运行 reduce()
方法。它看起来像这样:
var obj = { foo: 'fooValue', bar: 'barValue' };
var str = Object.keys(obj).reduce((accum, key)=>{
return accum + obj[key];
}, '');
// str = 'fooValuebarValue';
你可以使用 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 循环) 这是有道理的。
几个错误。
- 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);
但如果这是你想要的答案,则根本不需要reduce。看:
var obj = { foo: 'bar', bar: 'baz' };
console.log(Object.values(obj));