遍历嵌套数组并过滤未定义的

Iterating through nested arrays and filtering undefined

在 运行 到 Object.entries(); 之后遍历对象很棒,除非不是。

案例与要点:


[
  [
    '0',
    {
      A: 'a',
      B: 'b',
      C: 'c'
    }
  ],

  [
    '1',
    {
      A: 'z',
      B: 'x',
      C: 'y'
    }
  ]

]



这是数组 'me_data' 中数据结构的精确代理,恰好在 运行 通过 node . 节点中的 Object.entries 获取的数据之后记录到控制台 node .

重点不是Object.entries,而是后面的二次迭代,这里:


me_data.forEach(function(row){

row.forEach(function(col){

console.log(col);

});//end col
});//end row


console.log(列)的结果:


0
{
 A: 'a',
 B: 'b',
 C: 'c'
} 
1
{
 A: 'z',
 B: 'x',
 C: 'y'
}


控制台仅打印每个嵌套数组的迭代并为其编号。当您通过迭代的两个周期(或非代理数据的 400 个周期)访问每个数组中的元素之一时,就会出现问题。


me_data.forEach(function(row){

row.forEach(function(col){

console.log(col['A']);

});//end col
});//end row



每个循环的结果在下一行传递值后跟未定义,依此类推:




a
undefined
z
undefined


尝试过滤掉未定义的结果失败并出现错误

Error parsing JSON: TypeError: Cannot read property 'filter' of undefined


me_data.forEach(function(row){
row.forEach(function(col){

let filtered = col['A'].filter(function(x) {
     return x !== undefined;
});
 
console.log(filtered);

});//end col
});//end row


这里是不是少了什么?为什么每次迭代后控制台打印 'undefined'?如何在每次多维迭代期间从每个键值对嵌套数组中访问和使用属于相同命名键的值?

它打印出 undefined 的原因是因为 col 可能是字符串 '0' 或字符串 '1'。这意味着在某些循环中您尝试访问“0”['A'],这显然不存在。

现在据我了解,您正在尝试仅访问对象而不是字符串编号。

有几种方法可以做到这一点。

第一种(也是我推荐的方法)是这样写你的循环

me_data.forEach(([row, col]) =>{
  console.log(col);
});

在这种情况下,col 将始终指向对象。

您可以使用的第二种方法是

me_data.forEach(function(row){
  row.forEach(function(col){
    if(typeof col !== 'object') return;

    console.log(col);
  });
});

此方法将跳过所有非 object

类型的元素

我建议您不要使用包含索引和对象的数组数组的 me_data 结构,而是再次转换数据。如果你打开那些只是将索引与数据对象打包在一起的内部数组,你将有一个更容易的时间。此代码段显示了如何在转换后通过索引、键或索引和键访问数据。

const me_data = [
  [
    '0',
    {
      A: 'a',
      B: 'b',
      C: 'c'
    }
  ],

  [
    '1',
    {
      A: 'z',
      B: 'x',
      C: 'y'
    }
  ]

]


const transformed_me_data = me_data.map(arr => arr[1])

console.log('transformed_me_data:', transformed_me_data)

console.log('[0]:', transformed_me_data[0])
console.log('[1]:', transformed_me_data[1])

console.log('A:', transformed_me_data.map(obj => obj.A))
console.log('B:', transformed_me_data.map(obj => obj.B))
console.log('C:', transformed_me_data.map(obj => obj.C))

console.log('[0].A:', transformed_me_data[0].A)
console.log('[0].B:', transformed_me_data[0].B)
console.log('[0].C:', transformed_me_data[0].C)
console.log('[1].A:', transformed_me_data[1].A)
console.log('[1].B:', transformed_me_data[1].B)
console.log('[1].C:', transformed_me_data[1].C)