我想在值为字符串的对象上使用reduce。如果该值不包含目标字母,则将该值推入数组。
例如:
var animals = {a: 'pig', b: 'pony', c:'possum'};
useReduce(animals, "i"); // returns ['pony', 'possum'];
这是我到目前为止所做的,但我收到了一个错误:
var useReduce = function(obj, target) {
obj.reduce(function(previousValue, currentValue, key, obj) {
if (currentValue.indexOf(target) === -1) {
previousValue.push(currentValue);
};
}, []);
return previousValue;
};
答案 0 :(得分:1)
您可以将对象转换为键数组,然后可以减少。此外,previousValue
依赖于先前调用的返回值。你忘记了在reduce中返回。
function useReduce(obj, target) {
return Object.keys(obj).reduce((previousValue, key) => {
if (obj[key].indexOf(target) === -1) previousValue.push(key);
return previousValue;
}, []);
}
答案 1 :(得分:0)
正如评论者所暗示的那样,reduce
是一个数组方法,而不是一个对象方法。
看起来您正在按特定条件尝试filter
对象数组。以下是使用Array.prototype.filter
基于您的示例实现此目的的一种方法。
如果name
属性中的所有字符都不匹配第二个参数(在本例中为i
),则此函数将返回仅的对象数组。
var animals = [{name: 'pig'}, {name: 'pony'}, {name:'possum'}];
useReduce(animals, 'i');
function useReduce(arr, str) {
return arr.filter(function(obj) {
if (obj.name.match(str)) {
return false;
} else {
return true;
}
}
}
// returns [{name: 'pony'}, {name:'possum'}];
答案 2 :(得分:0)
作为此处发布的答案的替代方法,我只是想指出如何使用功能库解决这个问题,例如使用Ramda可以做到
const animals = {a: 'pig', b: 'pony', c:'possum'}
const noLetter = R.curry((letter, target) => {
return R.compose(R.reject(R.contains(letter)), R.values)(target)
})
noLetter('i', animals) // ["pony", "possum"]
const noLetterI = noLetter('i')
noLetterI(animals) // ["pony", "possum"]