【问题标题】:Iterating through nested arrays and filtering undefined遍历嵌套数组并过滤未定义
【发布时间】:2021-10-23 12:15:51
【问题描述】:

在运行Object.entries(); 之后遍历对象非常好,除非不是这样。

案例和要点:


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

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

]



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

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


me_data.forEach(function(row){

row.forEach(function(col){

console.log(col);

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


console.log(col) 的结果:


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



每个循环的结果在下一行传递值,然后是 undefined,依此类推:




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


这里有什么遗漏吗?为什么每次迭代后控制台都会打印“未定义”?在每次多维迭代过程中,如何从每个嵌套的键值对数组中访问和使用属于同一个命名键的值?

【问题讨论】:

  • 为什么是row.forEach 而不仅仅是row[1]?为什么Object.entries 而不仅仅是Object.values
  • row.forEach 因为它是一个大的嵌套数组,所以我们需要每个子数组的数据。 Objec.values 上的对象条目没有特殊原因,只是将解析后返回的整个 json 对象转换为数组,以防以后出现其他问题。
  • 我以为你只需要对象的 A 属性。您需要索引中的哪些数据?
  • 数据丢失的情况下会从apis带进来;但是,Object.values 在这里也可能就足够了。

标签: javascript node.js arrays multidimensional-array console


【解决方案1】:

它打印出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类型的元素

【讨论】:

  • 我喜欢使用两个for.Each,因为它很清楚,但是谢谢,这是更好的产品代码。有效的是在第二个循环中添加一个条件来访问值,if (col['A'] !== undefined){ let exVar = col['A']; console.log(exVar); } 但是没有意义的是为什么需要这样做。代码是否将索引以及col['A'] 中的值记录到控制台?
  • @F. 当然。是的,对不起,我对什么有点困惑。结束。目标是,但是。检查if (col['A'] !== undefined) 也应该有效。
  • @F. 当然。至于为什么需要这样做是因为当您访问行时,您实际上是在访问内部数组。这意味着第二个 for 循环正在循环 ['0', {A:'a', B:'b', C:'c'}]。这意味着您第一次循环col = '0',第二次循环col = {A:'a', B:'b', C:'c'}。由于这种访问col['A'] 在第一个循环中返回未定义,因为'0'['A'] 不存在。
  • 那么 col 是作为字符串列出的指针吗?那会很有趣,如果它不是有点烦人的话:) 第一种方法已经在我身上成长了,尽管将数组作为参数传递并不完全有意义,如果这是合法的,为什么不能传递一个嵌套的参数数组?
  • 我已经更正了,它不是字符串指针,而是双迭代的第一次迭代。这很清楚。
【解决方案2】:

我建议您再次转换数据,而不是使用带有索引和对象的数组数组的 me_data 结构。如果您解开那些只是将索引与数据对象打包的内部数组,您将有一个更轻松的时间。这个 sn-p 展示了在转换之后如何通过索引、键或索引和键访问数据。

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)

【讨论】:

  • 这是一种有趣的数据展平方式。
猜你喜欢
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2017-05-13
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
相关资源
最近更新 更多