包含对象的多维数组的深度比较



考虑以下数组结构。这是一个伪语法,其中TableRow只是一个ArrayRow包含不同的对象。我把它用于类似excel表格的应用程序。

Table [Row, Row, Row, ...]
0: Row
0: TextEntry {value: "1", active: false}
1: TextEntry {value: "3", active: false}
2: NumberEntry {value: 0, active: false}
1: Row
0: TextEntry {value: "text", active: false}
1: TextEntry {value: "8", active: false}
2: NumberEntry {value: 0, active: false}
2: Row
0: TextEntry {value: "1", active: false}
1: TextEntry {value: "3", active: false}
2: NumberEntry {value: 0, active: false}
...

我想通过比较value属性来确定Table内部是否有Row,它与另一个Row相同。在本例中,索引0上的array可能与索引2上的相同。

我如何在js中实现这一点?

我假设Array原型的someevery函数的组合应该足够了。带有some的版本返回布尔结果。带有filter的版本返回行本身。除非您想要实现的是检查表中是否包含重复的行?我在下面添加了一个例子。

const table = [
[
{value: "1", active: false},
{value: "3", active: false},
{value: 0, active: false}
],
[
{value: "text", active: false},
{value: "8", active: false},
{value: 0, active: false}
],
[
{value: "1", active: false},
{value: "3", active: false},
{value: 0, active: false}
]
];
const rowToFind=[
{value: "1", active: false},
{value: "3", active: false},
{value: 0, active: false}
];

let foundRows=table.filter(m => m.every((el, indx, arr)=>rowToFind[indx].value==el.value));
let foundRowsBoolean=table.some(m => m.every((el, indx, arr)=>rowToFind[indx].value==el.value));
console.log(foundRows);
console.log(foundRowsBoolean);
//Check duplicated rows
let foundDuplicates=table.some((el, indx)=> table.some((el2, indx2)=> indx!=indx2 && el.every((e, indx)=>e.value==el2[indx].value)));
console.log(`Contains duplicates: ${foundDuplicates}`);

最新更新