如何使用JavaScript及其值检查两列中的重复项?

时间:2016-10-27 09:07:49

标签: javascript arrays

我有一个这样的数据数组:

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

但是它不起作用而且速度非常慢,因为我实际上有大量的数据。

2 个答案:

答案 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 );