我正在尝试浏览一个包含多个数字的数组,并返回一个包含所有这些数字但没有重复数据的数组。我必须使用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>找到'未定义的
似乎我的阵列没有定义,但我不明白为什么它不会。有什么建议吗?
答案 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
是基本类型。
如果您无法避免或坚持使用reduce
和find
,请使用例如:
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);