Javascript reduce()&;find()抛出类型错误-无法读取属性';查找';未定义的
我试图遍历一个包含多个数字的数组,并返回一个包含所有这些数字但没有重复的数组。我必须使用JavaScript的Javascript reduce()&;find()抛出类型错误-无法读取属性';查找';未定义的,javascript,find,reduce,Javascript,Find,Reduce,我试图遍历一个包含多个数字的数组,并返回一个包含所有这些数字但没有重复的数组。我必须使用JavaScript的reduce和find方法。我该怎么做 我试图这样做: var numbers = [1, 1, 2, 3, 4, 4]; function unique(numbers) { var result = numbers.reduce(function(resultsArray, number) { resultsArray.find(function(numberInRes
reduce
和find
方法。我该怎么做
我试图这样做:
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:无法读取未定义的属性“find”
我的数组似乎没有定义,但我不明白为什么没有定义。有什么建议吗?的返回值将在下一个调用/步骤中变成resultsArray
的值。由于回调没有return语句,因此在第二次调用回调时,最初为空的数组[]
将未定义
如果要将数组减少到其唯一值,我建议使用以下方法:
功能唯一(数字){
返回[…新集合(编号)];
}
//例如:
log(惟一的([1,1,2,3,4,4])代码>的返回值将在下一个调用/步骤中成为resultsArray
的值。由于回调没有return语句,因此在第二次调用回调时,最初为空的数组[]
将未定义
如果要将数组减少到其唯一值,我建议使用以下方法:
功能唯一(数字){
返回[…新集合(编号)];
}
//例如:
log(惟一的([1,1,2,3,4,4])代码>您可以使用reduce完成,但不需要像这样查找。这样,您只能在对象中创建不能复制的关键点。生成所有键后,返回它们。这将生成O(n)解,该解是有效的
var数=[1,1,2,3,4,4];
函数唯一(数字){
var obj=数字。减少(函数(o,n){
o[n]=“val”;
返回o;
}, {});
返回Object.keys(obj);
}
var ans=唯一(数字);
ans=ans.map(编号);
控制台日志(ans)代码>您可以使用reduce完成,但不需要像这样查找。这样,您只能在对象中创建不能复制的关键点。生成所有键后,返回它们。这将生成O(n)解,该解是有效的
var数=[1,1,2,3,4,4];
函数唯一(数字){
var obj=数字。减少(函数(o,n){
o[n]=“val”;
返回o;
}, {});
返回Object.keys(obj);
}
var ans=唯一(数字);
ans=ans.map(编号);
控制台日志(ans)代码>数组已定义,find方法返回undefined。请阅读以下内容:@jsw324.reduce()
函数返回未定义在第一次迭代后,如果已定义数组,则find方法返回未定义。请阅读以下内容:@jsw324第一次迭代后返回undefined的.reduce()
函数是问题所在不使用集合的原因是对象。使用.reduce()
和.find()
可以根据属性值筛选唯一的对象。这两种方法是不能互换的。@mhodges很好。但在许多情况下(如OP所示),这些值要么是基本体,要么可以映射到基本体。@le_m Yup,你说得对。只是想指出为什么有人可能需要.reduce()
和.find()
供未来的观众观看。不使用集合的原因是对象。使用.reduce()
和.find()
可以根据属性值筛选唯一的对象。这两种方法是不能互换的。@mhodges很好。但在许多情况下(如OP所示),这些值要么是基本体,要么可以映射到基本体。@le_m Yup,你说得对。我只是想指出为什么有人可能需要.reduce()
和.find()
供未来的观众观看。您的第一个解决方案是将数字转换为字符串。例如,使用函数unique(numbers){return Object.values(numbers.reduce(function(o,n){o[n]=n;return o;},{},{}));}
-关于第二个解决方案,我建议在reduce回调中声明val
,并重命名为includes
o.e.,以提高可读性。@leu m谢谢!征求意见。我们修改了代码。但是,我没有使用Object.values()
,而是使用了map()
。另外,find看起来比includes更好,includes类似于函数名。您的第一个解决方案将数字转换为字符串。例如,使用函数unique(numbers){return Object.values(numbers.reduce(function(o,n){o[n]=n;return o;},{},{}));}
-关于第二个解决方案,我建议在reduce回调中声明val
,并重命名为includes
o.e.,以提高可读性。@leu m谢谢!征求意见。我们修改了代码。但是,我没有使用Object.values()
,而是使用了map()
。而且,find看起来比includes更好,includes类似于函数名。