我试图将一些值从一个对象推入一个 3 维数组

I am trying to push some values from an object into a 3 dimensional array

我正在尝试将一个对象移植到一个数组中。然而,一旦我到达 constructedQuestionBank[0][1],我就不能再在 Object.keys(conceptArray.Level1) 中插入信息。它返回错误“Uncaught TypeError: constructedQuestionBank[0][1].push is not a function”。

谁能支持我解决这个问题。我选择将信息放入数组的原因是我可以使用随机数生成来随机 select 数组中的某些部分。不过,这棵树需要保持完好无损。例如 (Level1 > Category1 > Item1 >text).

const conceptArray = {
    Level1: {
      Category1: {
        Item1: `text`,
        Item2: `text`,
      },

      Category2: {
        Item1: `text`,
        Item2: `text`,
      },
      Category3: {
        Item1: `text`,
        Item2: `text`,
      },
    },
      Level2: {
        Category1: {
          Item1: `text`,
          Item2: `text`,
        },
        Category2: {
          Item1: `text`,
          Item2: `text`,
        },
        Category3: {
          Item1: `text`,
          Item2: `text`,
        }
      }
}
    /*I want it to turn out something like this*/
    /*const exampleQuestionBank = [
        [`Level1`,
            [ `Category1`,
                [`Item1`,
                    [`text`]
                ],
                [`Item2`,
                    [`text`]
                ],
            ],
            [ `Category2`,
                [`Item1`,
                    [`text`]
                ],
                [`Item2`,
                    [`text`]
                ],
            ],
        ],
        [`Level2`,
            [ `Category1`,
                [`Item1`,
                    [`text`]
                ],
                [`Item2`,
                    [`text`]
                ],
            ],
            [ `Category2`,
                [`Item1`,
                    [`text`]
                ],
                [`Item2`,
                    [`text`]
                ],
            ],
        ],
    ]*/


    //What i have so far
    const constructedQuestionBank = [];
    const createQuestions = () => {
      constructedQuestionBank.push(Object.keys(conceptArray)); //inserts Levels

      Object.values(conceptArray).forEach(val => {
        constructedQuestionBank[0].push(Object.keys(val));
      }); //inserts Categories
      Object.values(conceptArray.Level1).forEach(val => {
        constructedQuestionBank[0][1].push(Object.keys(val));
      }); //Inserts Items 

      console.log(constructedQuestionBank)
    }
    createQuestions();

重要提示:我应该提到 Level1 Category1、Item1 等是为了便于理解的占位符。真正的键名只是字符。

另一种可能性能更高但性能更差 error-prone 的选项是将您的数据保留为对象,并改为使用随机数生成来键入对象。

因此,要随机 select 一个 text 元素,您可以在您的选项范围内生成 3 个随机数,并像这样访问它:

conceptArray[`Level${rand1}`][`Category${rand2}`][`Item${rand3}`]

Object.entries() 方法将对象转换为 key-value 对数组。您可以递归地使用此方法将所有嵌套级别转换为多维数组。

function objectToArray(obj) {
    if (typeof obj !== 'object') {
      return obj
    }
    return Object.entries(obj).map(entry => [entry[0], ojectToArray(entry[1])])
}
console.log(objectToArray(conceptArray))