В одном из моих угловых приложений у меня есть интерфейс
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)
нужно какое-то предложение.
Вы можете использовать эту функцию для установки значений обоих массивов:
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