'correctly create object with data

I have a loop where i iterate over the pixel data received from the method getImageData(). There I find the coordinates for each pixel (coordX and coordY). Then I filter the pixels depending on the color and I want to push the pixels I need into the object in the following way:

result.coords[coordX][coordY].counted

If with numbers, then like this:

result.coords = {
  1: {
    1: {
      counted: false,
    },
    2: {
      counted: false,
    },
  },
  2: {
    5: {
      counted: false,
    },
    8: {
      counted: false,
    },
    9: {
      counted: false,
    },
  },
};

I did this but there are problems:

var result = {
        coords: {},
    },
    pixel = new app.Color(),
    array = {},
    coordX,
    coordY,
    i;

for (i = 0; options.imageData && i < options.imageData.data.length; i += 4) {
    pixel.x = options.imageData.data[i];
    pixel.y = options.imageData.data[i + 1];
    pixel.z = options.imageData.data[i + 2];
    pixel.a = options.imageData.data[i + 3];
    coordX = (i / 4) % options.imageData.width;
    coordY = Math.floor(i / 4 / options.imageData.width);

    // Pixel filter by color
    if (pixel.x == 255 && pixel.a == 255) {
        array[coordY] = {
            counted: false,
        };

        result.coords[coordX] = array;
        // .. next is the code that is not important ..
    }
}

Problem of the following type: when I push a new Y coordinate, it is added to the array for all X. But I may have cases when, for example, the Y=5 coordinate will not be at the X=1 coordinate, but only at X=2 (as in example above). But in my case Y=5 will also be added to X=1.

Please tell me how to correctly create an object with property 'coords', in which there will be properties X, in which all Y related to it will be stored, in which there will also be property 'counted' with value False.

Edit:

I did like this:

data = {};
if (pixel.x == 255 && pixel.a == 255) {
    if (result.coords[coordX]) {
        for (var item in result.coords[coordX]) {
            data[item] = result.coords[coordX][item];
        }
    }

    data[coordY] = {
        counted: false,
    };
    
    result.coords[coordX] = data;
    data= {};
}


Solution 1:[1]

Given an i, the OP computes coordX and coordY. What's needed is something like an inverse to produce a key for the counting data structure.

const width = options.imageData.width;

function keyForXY(x, y) {
  return y * width + x
}

function setValueAtXY(object, x, y, value) {
  const key = keyForXY(x,y);
  object[key] = value;
}

function getValueAtXY(object, x, y) {
  const key = keyForXY(x,y);
  return object[key];
}

Replace your data structure access with these, like...

if (pixel.x == 255 && pixel.a == 255) {
  setValueAtXY(array, coordX, coordY, { counted: false });
  setValueAtXY(result.coords, coordX, coordY, array);
}

Note that I'm not sure exactly what's happening in the OP semantically... why for example we're placing a bool in an object or how "array" and "result.coords" relate to each other, so I'm not endorsing any of that, just mapping the OP logic into a more appropriate (seeming) data structure.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 danh