如何检查列表中相邻项目的值? Javascript

Posted

技术标签:

【中文标题】如何检查列表中相邻项目的值? Javascript【英文标题】:How to check values of adjacent items in a list? Javascript 【发布时间】:2022-01-18 01:32:28 【问题描述】:

我有一个类似这样的列表

let pixels = [
 [0,0,0,0]
 [0,0,0,0]
 [0,0,0,0]
]

我想遍历这个列表并为每个项目创建一个相邻项目的列表。在此示例中,我希望像素 [0] [0] 的输出是:[未定义,未定义,未定义,未定义,0,未定义,0, 0]。但是当我运行我的代码时,我得到了一个错误

代码无法读取像素[-1][-1],我只想让它读取为未定义,而不是让整个程序崩溃。

let pixels = [
  [0, 0, 0, 0],
  [0, 0, 0, 0],
  [0, 0, 0, 0]
]

function adjacent(i1, i2) 
  const yep = [pixels[i1 - 1][i2 - 1], pixels[i1 - 1][i2], pixels[i1 - 1][i2 + 1], pixels[i1][i2 - 1], pixels[i1][i2 + 1], pixels[i1 + 1][i2 - 1], pixels[i1 + 1][i2], pixels[i1 + 1][i2 + 1]]
  return yep


console.log(adjacent(1,4))

console.log(adjacent(-1,-1))

【问题讨论】:

你遇到了什么错误? 您无法访问undefined[-1] 属性。 如果i1小于等于1,下面的例子会抛出错误:pixels[i1 - 1][anything]。尝试一个条件来避免此类问题。 【参考方案1】:

i 超出范围时,pixel[i]undefinedundefined[anything] 为错误。

您可以使用optional chaining 来抑制这些错误。

let pixels = [
  [0, 0, 0, 0],
  [0, 0, 0, 0],
  [0, 0, 0, 0]
]

function adjacent(i1, i2) 
  const yep = [pixels[i1 - 1]?.[i2 - 1], pixels[i1 - 1]?.[i2], pixels[i1 - 1]?.[i2 + 1], 
    pixels[i1]?.[i2 - 1], pixels[i1]?.[i2 + 1], pixels[i1 + 1]?.[i2 - 1], 
    pixels[i1 + 1]?.[i2], pixels[i1 + 1]?.[i2 + 1]
  ]
  return yep


console.log(adjacent(1, 4))

console.log(adjacent(-1, -1))

【讨论】:

该死的。我做了 ]?[ 失败了。 @mplungjan 是的,语法不一致。该语法会与三元运算符冲突。 如果我不花时间制作一个有效的 sn-p,我会打败你的 ;) 是的,谢谢你:) 您可以通过投票来感谢我。我的脚本也适用于更多浏览器:)【参考方案2】:

你可以使用 && 来测试第一个元素是否存在

let pixels = [
  [0, 0, 0, 0],
  [0, 0, 0, 0],
  [0, 0, 0, 0]
]

function adjacent(i1, i2) 
  const yep = [
  pixels[i1 - 1] && pixels[i1 - 1][i2 - 1], 
  pixels[i1 - 1] && pixels[i1 - 1][i2], 
  pixels[i1 - 1] && pixels[i1 - 1][i2 + 1], 
  pixels[i1]     && pixels[i1][i2 - 1], 
  pixels[i1]     && pixels[i1][i2 + 1], 
  pixels[i1 + 1] && pixels[i1 + 1][i2 - 1], 
  pixels[i1 + 1] && pixels[i1 + 1][i2],
  pixels[i1 + 1] && pixels[i1 + 1][i2 + 1]]
  return yep


console.log(adjacent(1,4))

console.log(adjacent(-1,-1))

【讨论】:

【参考方案3】:

除了使用可选链外,还可以使用两个循环来生成相邻坐标,而不是手动写出每个可能性,这样更容易维护。

let pixels = [
  [0, 0, 0, 0],
  [0, 0, 0, 0],
  [0, 0, 0, 0]
]

function adjacent(i1, i2) 
  const res = [];
  for(let deltaY = -1; deltaY <= 1; deltaY++)
    for(let deltaX = -1; deltaX <= 1; deltaX++)
      if(deltaY != 0 || deltaX != 0)
        res.push(pixels[i1 + deltaY]?.[i2 + deltaX]);
  return res;


console.log(...adjacent(1,4))

console.log(...adjacent(-1,-1))

【讨论】:

以上是关于如何检查列表中相邻项目的值? Javascript的主要内容,如果未能解决你的问题,请参考以下文章

检查列表中的项目以查看它们是不是彼此相邻

在添加列表之前如何检查项目的值不等于零?

检查二维数组中相邻方块的值

如何根据原始列表相同的值但不同的索引创建新列表

Xamarin.forms如何在列表中显示彼此相邻的项目

Python - 如何用不同的值替换相邻的列表元素