reduce()& find()throw TypeError - 无法读取属性' find'未定义的

时间:2017-05-19 19:35:18

标签: javascript find reduce

我正在尝试浏览一个包含多个数字的数组,并返回一个包含所有这些数字但没有重复数据的数组。我必须使用reduce& find JavaScript方法。我该怎么做?

我试过这个:

var numbers = [1, 1, 2, 3, 4, 4];

function unique(numbers) {
  var result = numbers.reduce(function(resultsArray, number) {
    resultsArray.find(function(numberInResultsArray) {
      if (numberInResultsArray === number) {
        return true;
      }
    });
  }, []);

  return result;
}

unique(numbers);

...但它给了我一个TypeError

  

TypeError:无法读取属性&#39>找到'未定义的

似乎我的阵列没有定义,但我不明白为什么它不会。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

reduce callback的返回值将成为下一个调用/步骤中resultsArray的值。由于您的回调没有return语句,因此第二次调用回调时,最初为空的数组[]将为undefined

如果要将数组减少到其唯一值,我建议使用以下方法:



function unique(numbers) {
  return [...new Set(numbers)];
}

// Example:
console.log(unique([1, 1, 2, 3, 4, 4]));




只要数组值或可以映射到primitives,此方法就可以正常工作。 number是基本类型。

如果您无法避免或坚持使用reducefind,请使用例如:



function unique(numbers) {
  return numbers.reduce((unique, next) => {
    if (!unique.find(n => n === next)) unique.push(next);
    return unique;
  }, []);
}

// Example:
console.log(unique([1, 1, 2, 3, 4, 4]));




Set方法使用的线性时间相比,此解决方案在二次时间内完成。

答案 1 :(得分:0)

你可以用reduce来做,但没有像这样找到。这样,您只能在对象中创建无法复制的键。生成所有密钥后返回它们。这会生成有效的O(n)解决方案。



var numbers = [1, 1, 2, 3, 4, 4];

function unique(numbers) {
  var obj = numbers.reduce(function(o, n) {
    o[n] = 'val';
    return o;
  }, {});



  return Object.keys(obj);
}

var ans = unique(numbers);
ans = ans.map(Number);
console.log(ans);




修改 如果你想使用reduce和find,这里是你可以做到的(非箭头功能解决方案): 您收到错误的原因是因为您没有从reduce函数的回调中返回对象。如果在下一次迭代中为undefined,则您无法在其上调用find

var numbers = [1, 1, 2, 3, 4, 4];

           function unique(numbers) {

               var result = numbers.reduce(function (resultsArray, number) {
                   var found = resultsArray.find(function (numberInResultsArray) {
                       if (numberInResultsArray === number) {
                           return true;
                       }
                   });
                   if (!found) {
                       resultsArray.push(number);
                   }
                   return resultsArray;
               }, []);

               return result;
           }
var ans = unique(numbers);
console.log(ans);