JavaScript按指定列筛选数组生成子集及代码报错问题问询
问题根因
- 死循环是因为内层
for循环终止条件写错:你写的for (j=0; selections.length; j++)中,selections.length永远为真值,循环不会终止,自然触发死循环。 - 注释后报错是因为
tableData[i]没有初始化:去掉tableData[i] = toolData[i]后,tableData[i]是undefined,直接给undefined[0]赋值必然触发类型错误。另外原来的tableData[i] = toolData[i]是引用赋值,修改tableData会同步改动原始toolData数据,属于逻辑错误。
正确实现逻辑
你的原始数据是对象数组,列序号对应对象键的排列顺序,所以首先要先拿到首行数据的键列表作为列顺序的基准,再按选中的列序号提取对应值即可,代码如下:
var getData = () => axios.get('toolData.json') .then(res => res.data) .then(data => { const toolData = data; console.log(toolData); // 可动态修改,支持用户自主选择列 const selections = [0,1,2,4]; // 取首行的键作为列顺序基准 const columnKeys = Object.keys(toolData[0]); // 遍历生成结果数组 const tableData = toolData.map(row => { // 要保留键名用对象,要纯数组格式直接写[]即可 const newRow = {}; selections.forEach(selIndex => { const key = columnKeys[selIndex]; newRow[key] = row[key]; }) return newRow; }) console.log(tableData); })
如果需要输出纯数组格式的子集(每一行是值的数组而非对象),把newRow的初始化改成const newRow = [],赋值逻辑改成newRow.push(row[key])即可。
内容的提问来源于stack exchange,提问作者RichmondMJ
相关产品推荐
相关产品推荐

