从JavaScript的2D数组中删除相似的重复项



我需要从JavaScript中的2D数组中删除类似的重复项以及真正的重复项。

let a = [
[5, 6],
[1,1],
[6,5],
[1,1],
[3,2],
[2,3]
]
function makeUnique(arr) {
var uniques = [];
var itemsFound = {};
for(var i = 0, l = arr.length; i < l; i++) {
var stringified = JSON.stringify(arr[i]);
if(itemsFound[stringified])  continue; 
uniques.push(arr[i]);
itemsFound[stringified] = true;
}
return uniques;
}
a=makeUnique(a)
console.log(a);

我得到了这样的输出:

[[5, 6],[1],[6 5],[3 2],[2、3]]

正确的应该是:

[[5,6], [1,1], [2,3]]

我的代码删除了正确的重复项,但我也需要删除类似的重复项。

例如,如果我有[3,2]和[2,3],我应该删除[3,2](一个有更大的起始索引值)

你能帮我修理这个吗?

下面是一个示例:


function makeUnique(arr) {
var uniques = [];
var itemsFound = {};
arr.sort((a, b) => a[0] + a[1] - (b[0] + b[1]))
for (var i = 0, l = arr.length; i < l; i++) {
if (!itemsFound[arr[i]] && !itemsFound[[arr[i][1], arr[i][1]]]) {
uniques.push(arr[i]);
itemsFound[arr[i]] = true;
itemsFound[[arr[i][1], arr[i][0]]] = true;
}
}
return uniques;
}

我希望这对你有帮助。

有两部分

  1. 类似应考虑
  2. 在相似的
  3. 中,第一键较小的应该保留

1。类似的应该考虑

在这里,您可以为hashmap创建键,使类似的项产生相同的键。

一种方法是对元组中的项进行排序,然后形成键,因为只有两个项,第一个是min,第二个是max

let a = [
[5, 6],
[1,1],
[6,5],
[1,1],
[3,2],
[2,3]
]
function makeUnique(arr) {
var uniques = [];
var itemsFound = {};
for(var i = 0, l = arr.length; i < l; i++) {
let [a,b] = arr[i];
const hashKey = [ Math.min(a,b), Math.max(a,b)];
var stringified = JSON.stringify(hashKey);
if(itemsFound[stringified])  continue; 
uniques.push(arr[i]);
itemsFound[stringified] = true;
}
return uniques;
}
let ans1=makeUnique(a)
console.log(ans1);

2。类似的,第一键较小的应该留在

现在您可以在hashmap中记住键的值,并根据正确的候选

不断更新它
let a = [
[5, 6],
[1,1],
[6,5],
[1,1],
[3,2],
[2,3]
]
function makeUniqueSmallerFirst(arr) {
var items = {};
for(var i = 0, l = arr.length; i < l; i++) {
let [a,b] = arr[i];
const hashKey = [ Math.min(a,b), Math.max(a,b)];
var stringified = JSON.stringify(hashKey);

if (stringified in items) {
let previous = items[stringified];
if (previous[0] > arr[i][0]) {
items[stringified] = arr[i];
}
} else {
items[stringified] =  arr[i]  // I am just storing  the array because if I see a similar item next time, I can compare if that has first item smaller or not 
}
}
return Object.values(items); // this doesn't guarantee output order though
// if you want order as well . you can iterate over input array once more and arrange the items in the preferred order.
}
let ans2=makeUniqueSmallerFirst(a)
console.log(ans2);

已更新(更简单,更快速的ES5+示例):

function makeUnique(arr) {
return new Set(a.map(
arr => JSON.stringify(arr.sort((a, b) => a - b)))
)
}
const m = makeUnique(a)
console.log(m) // 

旧:

这是一个使任意长度的数组唯一的二维数组的代码示例。

let a = [
[5, 6],
[1, 1],
[6, 5],
[1, 5],
[3, 2],
[2, 3],
[6, 5, 3],
[3, 5, 6]
]
function isUnique(uniqueArray, checkedArray) {
let checked = [...checkedArray];
let unique = [...uniqueArray];
let uniqueValue = 0;
unique.forEach(value => {
if (checked.includes(value)) {
checked.splice(checked.indexOf(value), 1)
} else uniqueValue++;
})
return uniqueValue > 0;
}
function makeUnique(array2d) {
let unique = [array2d[0]]
array2d.forEach(checkedArray => {
if (unique.some(uniqueArray => {
if (checkedArray.length !== uniqueArray.length) return false;
return !isUnique(uniqueArray, checkedArray)
}
)) return 0;
else unique.push(checkedArray)
})
return unique
}
console.log(makeUnique(a)) // [ [ 5, 6 ], [ 1, 1 ], [ 1, 5 ], [ 3, 2 ], [ 6, 5, 3 ] ]

isUnique()此函数检查两个数组中的数字是否唯一,如果是,则输出true。我们使用了copy through spread操作符,这样当你从数组中删除一个数字时,从外部的数组不会受到影响。

makeUnique()函数通过以下方式使数组唯一:它检查我们唯一的二维数组是否至少有一个与checkedArray

相同的数组第一次检查数组长度是否不同-它们是唯一的,跳过并检查唯一性,如果!isUnique给出true,则数组被return 0跳过

相关内容

  • 没有找到相关文章

最新更新