Typescript — вставить элемент в многомерный массив, если он не существует

В одном из моих угловых приложений у меня есть интерфейс

export interface box {
    row : number;
    col : number;
    value : string;
    selected : boolean; 
};

И в компоненте.ts ,

obj : box[][] = []
allobj : any = []

В дальнейшем я получаю объект как:

this.obj = 
    [
        [{"row":0,"col":0,"value":"00"},{"row":0,"col":1,"value":"01"},{"row":0,"col":2,"value":"02"}],
        [{"row":1,"col":0,"value":"10"},{"row":1,"col":1,"value":"11"},{"row":1,"col":2,"value":"12"}],
        [{"row":2,"col":0,"value":"20"},{"row":2,"col":1,"value":"21"},{"row":2,"col":2,"value":"22"}]
    ]

и будет помещать этот объект в другой массив.

this.allobj.push(this.obj)

На следующей итерации получите объект как

this.obj = 
        [
            [{"row":0,"col":0,"value":"99"},{"row":0,"col":1,"value":"01"},{"row":0,"col":2,"value":"02"}],
            [{"row":1,"col":0,"value":"10"},{"row":1,"col":1,"value":"11"},{"row":1,"col":2,"value":"12"}],
            [{"row":2,"col":0,"value":"20"},{"row":2,"col":1,"value":"21"},{"row":2,"col":2,"value":"22"}]
        ]

И это будет отправлено в allobj, поскольку одно из первых значений отличается (00 и 99). Короче говоря, я хочу вставить массив obj в массив allobj, если он не существует. означает, что ни одно из «значений» в this.obj еще не присутствует в allobj. Я попробовал решение ниже, но оно тоже не работает.

let temp=JSON.parse(JSON.stringify(this.obj))
let arr_str = this.allobj.map(JSON.stringify)
!arr_str.includes(JSON.stringify(temp)) && this.allobj.push(temp) 
this.allobj.push(temp) 

нужно какое-то предложение.

Демо-версия игровой площадки 2


56
1

Ответ:

Решено

Вы можете использовать эту функцию для установки значений обоих массивов:

let obj : Box[][] = [];
let allobj: Box[][][] = [];

function setValues(val: Box[][]) {
  obj = val;
  const allowedVals = allobj.flat().flat();
  const notFound = val.flat().find(b => 
    allowedVals.find(
      a => a.value === b.value &&
        a.row === b.row &&
        a.col === b.col
    ) === undefined
  );
  if (notFound) {
    allobj.push(val);
  }
}

Функция ищет любой value в любом Box объекте.

1-й звонок:

setValues([
  [
    {"row":0,"col":0,"value":"00"},
    {"row":0,"col":1,"value":"01"},
    {"row":0,"col":2,"value":"02"}
  ],
  [
    {"row":1,"col":0,"value":"10"},
    {"row":1,"col":1,"value":"11"},
    {"row":1,"col":2,"value":"12"}
  ],
  [
    {"row":2,"col":0,"value":"20"},
    {"row":2,"col":1,"value":"21"},
    {"row":2,"col":2,"value":"22"}
  ]
]);

console.info(obj.flat().length,allobj.length); // 9, 1

2-й звонок:

setValues([
  [
    {"row":0,"col":0,"value":"99"}, // <-- only difference
    {"row":0,"col":1,"value":"01"},
    {"row":0,"col":2,"value":"02"}
  ],
  [
    {"row":1,"col":0,"value":"10"},
    {"row":1,"col":1,"value":"11"},
    {"row":1,"col":2,"value":"12"}
  ],
  [
    {"row":2,"col":0,"value":"20"},
    {"row":2,"col":1,"value":"21"},
    {"row":2,"col":2,"value":"22"}
  ]
]);

console.info(obj.flat().length, allobj.length); // 9, 2

Демо-версия игровой площадки

Демо-версия игровой площадки 2


Интересные вопросы для изучения