我有一个这样的数据数组:
var data = [
// Columns
['Target ID', 'Source ID', 'Label'],
// Key: 1
[1, 2, 'String 1/2'],
[1, 3, 'String 1/3'],
[1, 4, 'String 1/4'],
[1, 5, 'String 1/5'],
// Key: 2
[2, 1, 'String 2/1'],
[2, 3, 'String 2/3'],
[2, 4, 'String 2/4'],
[2, 5, 'String 2/5'],
// Key: 3
[3, 1, 'String 3/1'],
[3, 2, 'String 3/2'],
[3, 4, 'String 3/4'],
[3, 5, 'String 3/5']
]
如您所见,我在上面的数组中有重复的项目,即:
[1, 2, 'String 1/2']
和
[2, 1, 'String 2/1']
我无法找出删除这些副本的逻辑。
到目前为止,我所获得的只是通过第一个键值删除重复的项目(因为数组/数据是从CSV创建的),即。 [1, 1, 'String 1/2']
。
基本上我的问题是:如何从上面的数组中删除重复的项目?
编辑:更好地解释我的问题。
数组中索引2
处的字符串与任何内容无关 - 它只是一个描述符。
数组中的第一项是键 - 在我提供的示例中它们是 - 1, 2, 3
- 因此,第二项与数组中其他位置的键相关,因此,{{1}之间的关系}和1, 2
是重复的 - 我想删除那些。
编辑2:在上面的数组中添加了列项:
所以,现在我希望它更清楚 - 每个数组中的第一项是2, 1
,第二项是Target ID
,第三项根本不是相关的。
我的目标和需求是删除数组中已经出现的所有项目,如果前面任何数组/项目中的Source ID
。
我尝试过一些愚蠢的事情:
Target ID === Source ID
但是它不起作用而且速度非常慢,因为我实际上有大量的数据。
答案 0 :(得分:2)
您可以使用带有排序键的哈希表过滤数据。
checkMultiplePermissions
var data = [['1', '2', 'String 1/2'], ['1', '3', 'String 1/3'], ['1', '4', 'String 1/4'], ['1', '5', 'String 1/5'], ['2', '1', 'String 2/1'], ['2', '3', 'String 2/3'], ['2', '4', 'String 2/4'], ['2', '5', 'String 2/5'], ['3', '1', 'String 3/1'], ['3', '2', 'String 3/2'], ['3', '4', 'String 3/4'], ['3', '5', 'String 3/5']];
data = data.filter(function (a) {
var key = a.slice(0, 2).sort().join('|');
return !this[key] && (this[key] = true);
}, Object.create(null));
console.log(data);
答案 1 :(得分:1)
我无法弄清楚删除那些重复的逻辑。
尝试这种方法
var arr = [
[1, 2, 'String 1/2'],
[1, 3, 'String 1/3'],
[1, 4, 'String 1/4'],
[1, 5, 'String 1/5'],
[2, 1, 'String 2/1'],
[2, 3, 'String 2/3'],
[2, 4, 'String 2/4'],
[2, 5, 'String 2/5'],
[3, 1, 'String 3/1'],
[3, 2, 'String 3/2'],
[3, 4, 'String 3/4'],
[3, 5, 'String 3/5']
];
var map = {}; //initialize this map
var output = arr.filter( function(item){
var key1 = item[0], key2 = item[1];
map[key1] = map[key1] || {}; //create a map of map[1] for chain of 1
map[key2] = map[key2] || {}; //create a map of map[2] for chain of 2
map[key1][key2] = true; //now mark the map[1][2] to true
return !map[ key2 ][ key1 ] ; //check if map[2][1] is not true
});
console.log( output );