与javascript中的Array.reduce()相反

与javascript中的Array.reduce()相反,javascript,arrays,loops,Javascript,Arrays,Loops,reduce()获取一个数组并将数组中的元素与累加器组合,直到所有元素都被消耗 是否有一个函数(在其他语言中通常称为“展开”)以值开始并不断生成元素,直到生成完整的数组(累加器耗尽) 我试图这样做,作为在任意基之间转换的一部分。我的代码如下,但我想消除原始循环 var dstAlphabet = "0123456789ABCDEFGH"; var dstBase = dstAlphabet.length; var wet = BigInteger(100308923948716816384684

reduce()获取一个数组并将数组中的元素与累加器组合,直到所有元素都被消耗


是否有一个函数(在其他语言中通常称为“展开”)以值开始并不断生成元素,直到生成完整的数组(累加器耗尽)

我试图这样做,作为在任意基之间转换的一部分。我的代码如下,但我想消除原始循环

var dstAlphabet = "0123456789ABCDEFGH";
var dstBase = dstAlphabet.length;
var wet = BigInteger(100308923948716816384684613592839);
var digits_reversed = [];
while (wet.isPositive())
{
  // var digitVal = wet % dstBase
  var divRem = wet.divRem(dstBase); // [result of division, remainder]
  wet = divRem[0];
  digits_reversed.push(dstAlphabet.charAt(divRem[1].toJSValue()));
}

return digits_reversed.reverse().join("");

tewathia的评论似乎是一种惯用的方式,但我想如果你想用这种方式来做,你可以编写自己的递归原语,比如:

function unreduce(accumulator, operation, stopPredicate, ret) {
    return helper([accumulator, ret])[1]

    function helper(vals) {
        if (stopPredicate(vals[0])) return vals[1];

        return helper(operation(vals[0], vals[1]));
    }
}
您可能需要对其进行一些修改,以便为回调保留

我不知道那有多好。
操作需要更新累加器和返回值,这有点麻烦。外部函数无法保存
操作
以避免返回长度为2的数组。

//现在你只需一行就可以做到:
const unfold=(累加器,长度)=>lengthJavascript中的相反是(或者可选)。您可以将其与任何对象一起使用以生成数组:

array = Array.from(iterator); // same as array = [...iterator];
您可以通过调用以下命令来创建迭代器:

生成器函数使用特殊关键字返回其结果(或从另一个iterable返回所有结果)。一旦它们返回,它们就会耗尽:

功能*convertBase(湿,字母){
const base=BigInt(字母表长度);
湿=BigInt(湿);
而(湿>0){
const digitVal=数量(湿基百分比);
湿=湿/底;
产量字母表字符(数字);
}
}

console.log(Array.from(convertBase(100308923948471681638484613592839,“0123456789ABCDEFGH”)).reverse().join(“”)“直到生成一个完整的数组”-您能为此提供一个正式的定义吗?什么是“完整数组”?假设的函数如何知道数组是否已完成?zerkms:也许您提供了第二个函数来确定值是否已耗尽?看起来您正在尝试将数字转换为基数18…为什么不直接执行
(100308923948792839)。toString(18)
?tewathia,您是对的,但是这只适用于32位的数字(我已经修改了这个例子)。可能是一本关于折叠和展开的有趣读物。。。欢迎来到stackoverflow。请包括对代码的解释以及如何解决问题。
iterator = generate(params);