В одном из моих угловых приложений у меня есть интерфейс
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)
нужно какое-то предложение.
• Пожалуйста, включите весь соответствующий код в виде открытого текста в сам вопрос . Ссылки на код недостаточны, чтобы быть минимально воспроизводимым примером. До тех пор, пока код не будет включен сюда в виде открытого текста, вопрос рискует быть закрыт из-за необходимости подробностей отладки. • Боюсь, добавленные примеры не помогут мне это понять. Не могли бы вы использовать несколько слов, чтобы описать, куда нам следует смотреть? Или сократить примеры с сетки 3x3 до сетки 2x1 или чего-то еще, где различия очевидны?
Вы можете использовать эту функцию для установки значений обоих массивов:
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 . означает не нажимать элемент.
извини, я допустил ошибку, должно быть !allowedVals.includes(valueInObj)
не allowedVals.includes(valueInObj)
Спасибо @Remo. Теперь это сработало. но заметил одну проблему. Я проверяю только существование значения, независимо от его позиции. Например, если я поставлю "{"row":0,"col":1,"value":"99"}" еще в один вызов. он пропустит это из-за {"row":0,"col":0,"value":"99"} при втором нажатии. в идеале его следует вставить, поскольку позиция другая. расскажите, пожалуйста, как добавить строку и столбец для сопоставления.
Я обновил функцию, чтобы также проверять свойства столбца и строки.
Спасибо @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-й толчок также должен произойти, поскольку в целом это другая коробка.
Пожалуйста, поделитесь ссылкой на игровую площадку, чтобы я мог лучше понять
Отредактирован вопрос и добавлен «Демо-версия игровой площадки 2». обратите внимание, что может быть несколько перестановок и комбинаций, поскольку поле может отличаться в любой позиции (строка, столбец)
Я не уверен, имеет ли значение порядок элементов в массиве; Я не думаю, что смогу уделять больше времени этому вопросу. Пожалуйста, взгляните на демо 2 в моем ответе.
Спасибо @Remo. Я тщательно протестировал его, и он работал как шарм. Это именно то, чего я хочу. Огромное спасибо за помощь.
Пожалуйста, отредактируйте , чтобы предоставить минимально воспроизводимый пример , который мы можем скопировать и вставить в наши собственные 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"}]
, нажимать или нет? Наконец, чтобы ваш код был минимально воспроизводимым примером, вам нужно сказать нечто большее, чем «это тоже не работает». В чем конкретно оно не работает?