![](/img/trans.png)
[英]How to double these numbers in an array using recursion, rest/spread operators and destructuring?
[英]How to count instances of numbers in an array using recursion?
我尝试使用递归(练习的一部分)编写一个 function(称为:tally)来扫描一个数字数组并返回一个 object,其中数字作为键,实例数作为值。
例子:
tally([2,3,4,5,5,5,5,5,5,5,6,7,,6,7,6,7,5,4,3,4,5,5,6])
//{2: 1, 3: 2, 4: 3, 5: 10, 6: 4, 7: 3}
我创建了框架,但我不确定使其工作的语法:
function tally(arr) {
var obj = {}
if (/*check if object ('obj') has a key corresponding to the array element*/) {
//increase key's value by onee
} else {
//add key with value of 1
}
return obj
};
完成上述递归 function 的任何提示? 请尽量在你的答案中坚持我的结构,因为这是练习的一部分。
给你:
function tally(arr) {
if (arr.length == 0) {
return {}
}
var value = arr.pop()
var obj = tally(arr)
if (value in obj) {
obj[value] += 1
} else {
obj[value] = 1
}
return obj
};
编辑:也可以使用slice()
而不是pop()
来完成:
function tally(arr) {
if (arr.length == 0) {
return {}
}
var value = arr[0]
var obj = tally(arr.slice(1))
if (value in obj) {
obj[value] += 1
} else {
obj[value] = 1
}
return obj
};
好的,所以你被要求做一个递归只是为了它。
这可以通过将一个额外的参数传递给tally
来完成(尽管这很老套)。 当你在 vanilla js 中声明一个 function 时,你实际上可以给它额外的东西。 因此,在每次递归中,将obj
作为第二个参数传递:
编辑谢谢@Bergi,你是对的。 我将编辑代码
function tally(arr) { let obj = arguments.length>1? arguments[1]: {}; if(arr.length===0) { return obj; } let next_number=arr.pop(); obj[next_number]=obj[next_number]||0; obj[next_number]++; return tally(arr,obj); }; let inputArr = [2,3,4,5,5,5,5,5,5,5,6,7,6,7,6,7,5,4,3,4,5,5,6], outputObj=tally(inputArr); console.log(outputObj); console.log({outputEmpty:tally([])});
我不确定如何在不完全放弃的情况下引导您找到答案,但这是我的建议。 (过程中有你销毁arr等问题你可能要考虑)
function tally(arr, obj) {
// if the length is zero we've gone through every value
if(arr.length === 0)
return obj
// create obj if we didn't provide it
if(obj === undefined)
obj = {}
// pull the last value from arr
let val = arr.pop()
if (/*check if object ('obj') has a key corresponding to the array element*/) {
//increase key's value by onee
} else {
//add key with value of 1
}
// move onto the next value
return tally(arr,obj)
}
编辑:接受@Bergi 的意见
使用索引的额外参数i
,结果r
-
const plus1 = (k = "", r = {}) => ( k in r? r[k] += 1: r[k] = 1, r ) const tally = (a = [], i = 0, r = {}) => i >= a.length? r: tally ( a, i + 1, plus1(a[i], r) ) console.log(tally([2,3,4,5,5,5,5,5,5,5,6,7,,6,7,6,7,5,4,3,4,5,5,6]))
Output
{
"2": 1,
"3": 2,
"4": 3,
"5": 10,
"6": 4,
"7": 3,
"undefined": 1
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.