Javascript 将一维数组转换为多维数组

Javascript 将一维数组转换为多维数组,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,在Javascript中,如何将一维数组转换为深度或长度未指定的多维数组 例如: let input = ['a','b','b','b','a','a','b','b','b','c','c','a','a','b','b']; const makeMatrix = () => {} let output = makeMatrix(input); // output: ['a',['b','b','b'],'a','a',['b','b','b',['c','c']],'a','a'

在Javascript中,如何将一维数组转换为深度或长度未指定的多维数组

例如:

let input = ['a','b','b','b','a','a','b','b','b','c','c','a','a','b','b'];
const makeMatrix = () => {}

let output = makeMatrix(input);

// output: ['a',['b','b','b'],'a','a',['b','b','b',['c','c']],'a','a',['b','b']]
要完成此任务,makeMatrix函数应该是什么样子?假设值始终沿线性前进方向移动,但可能向后剪切。所以a总是导致b。a永远不会跳到c。但c可能会降回a


这是为了尝试将标题元素转换为目录。制作一个简单的单层toc很容易,但制作一个多层toc却让我头疼不已。我看过很多解决方案,但没有看到任何解决这个问题的方法。

我心目中的哑巴评估解决方案,如果它是你想要的,它可以变得整洁

function toMulti(arr) {
    let str = "[";
    let level = 1;
    const charLevels = { a: 1, b: 2, c: 3 };
    arr.forEach(char => {
        const charLevel = charLevels[char];
        if (level < charLevel) {
            for (let i = 0; i < charLevel - level; i++) {
                str += "[";
            }
        }
        if (level > charLevel) {
            for (let i = 0; i < level - charLevel; i++) {
                str += "],";
            }
        }
        level = charLevel;
        str += `'${char}',`;
    });
    for (let i = 0; i < level; i++) {
        str += "]";
    }
    return eval(str);
}
函数到多路(arr){
让str=“[”;
设水平=1;
常量charLevels={a:1,b:2,c:3};
arr.forEach(char=>{
常量charLevel=charLevels[char];
如果(电平<电平){
for(设i=0;i字符级别){
for(设i=0;i
您可以使用级别变量和级别数组来推送未知元素

var input=['a','b','b','a','a','b','b','b','c','a','a','b','b'],
级别=[]],
级别=0,
结果;
input.forEach(v=>{
var l=水平;
做{
如果(级别[l][0]==v){
级别=l;
级别[级别]。推送(v);
返回;
}
}而(l--)
级别[级别]。推送(级别[级别+1]=[v]);
级别++;
});
结果=水平[0][0];
控制台日志(结果)

.as控制台包装{max height:100%!important;top:0;}
替代版本,使用JSON构建/解析:

const input=['a','b','b','b','a','a','b','b','b','c','c','a','a','b','b'];
const result=JSON.parse(Object.entries(input).reduce((JSON[key,val])=>{
constjsonval=JSON.stringify(val);
const diff=key>0?val.charCodeAt(0)-输入[key-1]。charCodeAt(0):0;
如果(差异>0){
json+=',['。重复(差异)+jsonVal;
}否则如果(差异<0){
json+=']'。重复(-diff)+','+jsonVal;
}否则{
json+=(键>0?',':'')+jsonVal;
}
返回json;
}重复(input.slice(-1)[0].charCodeAt(0)-input[0].charCodeAt(0)+1));

控制台日志(结果)涉及数字数组的解决方案对您也有用吗?转换输入的过程是什么?看起来您希望“a”位于级别1,“b”位于级别2,“c”位于级别3,等等。如果是这样,我认为最简单的方法是简单地创建一个以“[”开头的字符串,跟踪您所在数组的当前深度(从1开始),并在每个字符上添加“[”或“]”分别使其处于字符的正确级别,然后将“中包含的”字符添加到字符串中,并在最后将字符串求值到数组中。@JackBashford我不完全确定我是否理解您所描述的内容。但是,如果它不是一个多维数数组,则不需要。@Countingstuff如果您能找到解决方案的话,我很想看看。你真的用了“a”、“b”、“c”这样的字母吗,等等,或者你只是用这些作为例子?否则,我们如何确定级数?哈哈,这比我愚蠢的评估要好得多:D。每次我回到这个答案,它都有一点改变。@bronkula,我改变了内部循环的结构,现在它从级别循环到零。循环现在比以前简单得多。