【问题标题】:Sorting coordinates排序坐标
【发布时间】:2021-10-06 17:05:17
【问题描述】:

我正在使用 CC Tweaked Mod 编写 Minecraft 的 Paint 版本 问题是我给我的程序一个数组,程序一个接一个地遵循数组的顺序。

这意味着如果我在左上角然后右下角画一些东西,然后我填充其他所有东西,它将遵循这个顺序(这不是很有效)

我有一个名为 output 的数组 这是数组的样子

[
  { x: 0, y: 0, color: 12 },
  { x: 1, y: 0, color: 3 },
  { x: 2, y: 0, color: 5 },
  { x: 0, y: 1, color: 8 },
  { x: 1, y: 1, color: 10 },
  { x: 2, y: 1, color: 11 },
  { x: 0, y: 2, color: 12 },
  { x: 2, y: 2, color: 3 },
  { x: 1, y: 2, color: 14 }
]

数组来自这个“绘图”(暂时忽略箭头)

现在的问题 我怎样才能从第一个数组得到一个看起来像这样的数组

[
  { x: 0, y: 0, color: 12 },
  { x: 1, y: 0, color: 3 },
  { x: 2, y: 0, color: 5 },
  { x: 2, y: 1, color: 11 },
  { x: 1, y: 1, color: 10 },
  { x: 0, y: 1, color: 8 },
  { x: 0, y: 2, color: 12 },
  { x: 1, y: 2, color: 14 }
  { x: 2, y: 2, color: 3 },
]

(看看它是如何跟随箭头的?)

这样会快很多。

有些方块可能没有填充任何颜色。我知道这可能有多重要

如果重要,这些是颜色代码

const LISTOFCOLORS = {
    white: 1,
    orange: 2,
    magenta: 3,
    dodgerblue: 4,
    yellow: 5,
    lime: 6,
    pink: 7,
    gray: 8,
    lightgray: 9,
    cyan: 10,
    purple: 11,
    blue: 12,
    SaddleBrown: 13,
    green: 14,
    red: 15,
    black: 16
}

【问题讨论】:

    标签: javascript node.js arrays sorting


    【解决方案1】:

    @axtck 非常感谢。我最终没有使用切片,而是从您的帖子中获得的“将数组切片到多个数组中并从那里工作”部分

    我最终得到了这个

    
    
    const arr = [
        { x: 1, y: 4, color: 12 },
        { x: 2, y: 4, color: 12 },
        { x: 2, y: 3, color: 12 },
        { x: 2, y: 2, color: 12 },
        { x: 2, y: 1, color: 12 },
        { x: 0, y: 0, color: 12 },
        { x: 1, y: 0, color: 12 },
        { x: 1, y: 1, color: 12 },
        { x: 4, y: 1, color: 12 },
        { x: 3, y: 2, color: 12 },
        { x: 1, y: 3, color: 12 },
        { x: 0, y: 3, color: 12 },
        { x: 0, y: 1, color: 12 },
        { x: 0, y: 2, color: 12 },
        { x: 1, y: 2, color: 12 },
        { x: 3, y: 4, color: 12 },
        { x: 4, y: 4, color: 12 },
        { x: 4, y: 0, color: 12 },
        { x: 3, y: 0, color: 12 },
        { x: 2, y: 0, color: 12 },
        { x: 3, y: 1, color: 12 },
        { x: 4, y: 2, color: 12 },
        { x: 4, y: 3, color: 12 },
        { x: 0, y: 4, color: 12 },
        { x: 3, y: 3, color: 12 }
    ]
    
    const ArrayOfArrays = []
    const dimension = 5
    
    for (let i = 0; i < dimension; i++) {
    
        let array = []
    
    
        for (let j = 0; j < arr.length; j++) {
            if (i == arr[j].y) {
                array.push(arr[j])
            }
        }
    
        ArrayOfArrays.push(i % 2 === 0 ?
            array.sort(function (a, b) {
                return a.x - b.x;
            }) : array.sort(function (a, b) {
                return b.x - a.x;
            }))
    
    }
    
    
    
    
    
    console.log(ArrayOfArrays)
    
    

    输出将是

    [
      [
        { x: 0, y: 0, color: 12 },
        { x: 1, y: 0, color: 12 },
        { x: 2, y: 0, color: 12 },
        { x: 3, y: 0, color: 12 },
        { x: 4, y: 0, color: 12 }
      ],
      [
        { x: 4, y: 1, color: 12 },
        { x: 3, y: 1, color: 12 },
        { x: 2, y: 1, color: 12 },
        { x: 1, y: 1, color: 12 },
        { x: 0, y: 1, color: 12 }
      ],
      [
        { x: 0, y: 2, color: 12 },
        { x: 1, y: 2, color: 12 },
        { x: 2, y: 2, color: 12 },
        { x: 3, y: 2, color: 12 },
        { x: 4, y: 2, color: 12 }
      ],
      [
        { x: 4, y: 3, color: 12 },
        { x: 3, y: 3, color: 12 },
        { x: 2, y: 3, color: 12 },
        { x: 1, y: 3, color: 12 },
        { x: 0, y: 3, color: 12 }
      ],
      [
        { x: 0, y: 4, color: 12 },
        { x: 1, y: 4, color: 12 },
        { x: 2, y: 4, color: 12 },
        { x: 3, y: 4, color: 12 },
        { x: 4, y: 4, color: 12 }
      ]
    ]
    
    

    注意 x 值如何上下波动

    【讨论】:

      【解决方案2】:

      如果您只是反转 3 - 6 条目,您可以使用 slice() 从旧数组的切片创建一个新数组,并使用 reverse() 反转指定的条目。

      const rowByRow = [
        { x: 0, y: 0, color: 12 },
        { x: 1, y: 0, color: 3 },
        { x: 2, y: 0, color: 5 },
        { x: 0, y: 1, color: 8 },
        { x: 1, y: 1, color: 10 },
        { x: 2, y: 1, color: 11 },
        { x: 0, y: 2, color: 12 },
        { x: 2, y: 2, color: 3 },
        { x: 1, y: 2, color: 14 }
      ];
      
      const result = [
        ...rowByRow.slice(0, 3), 
        ...rowByRow.slice(3, 6).reverse(), // reverse 3 - 6 entries 
        ...rowByRow.slice(6, 9)
      ];
      
      console.log(result);

      【讨论】:

      • 我使用的示例对于 SO 问题来说有点愚蠢。我给的数组不是这样的。请记住,这是一个绘画程序,用户通常不会从左到右。如果我可以先以这种格式获取数组,您的解决方案将起作用
      • 但是切片部分很有趣。如果我可以创建多个数组,其中每个数组都分配一个 y 坐标,我可以按 x 坐标对这些数组进行排序并将它们粘在一起
      • @Venox 您可以使用此方法尝试一些事情。如果您可以用更具体的信息更新您的问题,我可以跟进。
      猜你喜欢
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 2023-02-02
      • 2022-01-12
      • 2012-06-02
      • 1970-01-01
      相关资源
      最近更新 更多