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

Пожалуйста, отредактируйте , чтобы предоставить минимально воспроизводимый пример , который мы можем скопировать и вставить в наши собственные IDE и приступить к работе. Это означает, что если вы пишете this, вам также следует предоставить окружающий контекст, в котором это имеет смысл (предположительно, тело класса). Также было бы полезно, если бы вы привели несколько коротких примеров использования; например, если оригинал — [{row:0,col:0,value:"99"},{row:0,col:1,value: "88"}], а следующий — [{row:0,col:0,value:"88"},{row:0,col:1,value:"99"}], нажимать или нет? Наконец, чтобы ваш код был минимально воспроизводимым примером, вам нужно сказать нечто большее, чем «это тоже не работает». В чем конкретно оно не работает?

jcalz 19.08.2024 15:39

Пожалуйста, включите весь соответствующий код в виде открытого текста в сам вопрос . Ссылки на код недостаточны, чтобы быть минимально воспроизводимым примером. До тех пор, пока код не будет включен сюда в виде открытого текста, вопрос рискует быть закрыт из-за необходимости подробностей отладки. • Боюсь, добавленные примеры не помогут мне это понять. Не могли бы вы использовать несколько слов, чтобы описать, куда нам следует смотреть? Или сократить примеры с сетки 3x3 до сетки 2x1 или чего-то еще, где различия очевидны?

jcalz 20.08.2024 14:48
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Спасибо @Remo за быстрый ответ. Но это не работает, как указано в ссылке «Демо-версия игровой площадки». Во второй консоли он печатает 9,1 . означает не нажимать элемент.

usersam 19.08.2024 19:14

извини, я допустил ошибку, должно быть !allowedVals.includes(valueInObj) не allowedVals.includes(valueInObj)

Remo H. Jansen 19.08.2024 20:15

Спасибо @Remo. Теперь это сработало. но заметил одну проблему. Я проверяю только существование значения, независимо от его позиции. Например, если я поставлю "{"row":0,"col":1,"value":"99"}" еще в один вызов. он пропустит это из-за {"row":0,"col":0,"value":"99"} при втором нажатии. в идеале его следует вставить, поскольку позиция другая. расскажите, пожалуйста, как добавить строку и столбец для сопоставления.

usersam 19.08.2024 20:42

Я обновил функцию, чтобы также проверять свойства столбца и строки.

Remo H. Jansen 20.08.2024 01:04

Спасибо @Remo. но есть еще одна проблема. 2-е нажатие {"row":0,"col":0,"value":"99"} // только разница // 9, 2 отлично; 3-е нажатие {"row":0,"col":0,"value":"00"} & {"row":1,"col":0,"value":"99"} // 9,3 отлично ; 4-е нажатие {"row":0,"col":0,"value":"99"} & {"row":1,"col":0,"value":"99"} // 9,3 не хорошо; 4-й толчок также должен произойти, поскольку в целом это другая коробка.

usersam 20.08.2024 11:45

Пожалуйста, поделитесь ссылкой на игровую площадку, чтобы я мог лучше понять

Remo H. Jansen 20.08.2024 12:20

Отредактирован вопрос и добавлен «Демо-версия игровой площадки 2». обратите внимание, что может быть несколько перестановок и комбинаций, поскольку поле может отличаться в любой позиции (строка, столбец)

usersam 20.08.2024 14:33

Я не уверен, имеет ли значение порядок элементов в массиве; Я не думаю, что смогу уделять больше времени этому вопросу. Пожалуйста, взгляните на демо 2 в моем ответе.

Remo H. Jansen 20.08.2024 16:01

Спасибо @Remo. Я тщательно протестировал его, и он работал как шарм. Это именно то, чего я хочу. Огромное спасибо за помощь.

usersam 22.08.2024 13:37

Другие вопросы по теме