对对象使用reduce可返回不包含数组中目标字母的单词

时间:2016-05-18 00:17:42

标签: javascript reduce

我想在值为字符串的对象上使用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;
};

3 个答案:

答案 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"]