Javascript 当两个属性需要计算唯一性时使用过滤器

Javascript 当两个属性需要计算唯一性时使用过滤器,javascript,Javascript,我已经看到了很多很好的例子,当只需要计算一个属性来确定唯一性时,可以使用过滤器从数组中删除重复项 我调用了一个函数来创建一个对象: function fullTableObject(TableName, AuditAction, RowNumber) { this.TableName; this.AuditAction; this.RowNumber; } 然后,我循环遍历多个结果集以构建上

我已经看到了很多很好的例子,当只需要计算一个属性来确定唯一性时,可以使用过滤器从数组中删除重复项

我调用了一个函数来创建一个对象:

        function fullTableObject(TableName, AuditAction, RowNumber) {
            this.TableName;
            this.AuditAction;
            this.RowNumber;
        }
然后,我循环遍历多个结果集以构建上面对象的数组,如下所示:

var allTables = [];

for (var i = 0; i < tableNameArray.length; i++) {
    var oTable = new fullTableObject();
    oTable.TableName = tableNameArray[i];
    oTable.AuditAction = auditActionArray[i];
    oTable.TableRowNumber = i;
    allTables.push(oTable);
}
var allTables=[];
对于(var i=0;i
我的问题是如何消除基于2个属性的重复项?例如,我可能在数组中有2个对象,其中TableName属性设置为“MYFIRSTTABLE”,AuditAction的值将为“UPDATE”和“INSERT”,从而使这些对象唯一,这是可以的

我试图解释的实例是2个或多个案例,TableName设置为“MYSECONDTABLE”,每个AuditAction设置为“UPDATE”。在这种方法中,是否可以使用筛选器来说明2个属性?

您可以使用筛选器跟踪唯一的
表名和
审核操作:

var allTables = [];
var uniqueTableNames = new Set();
var uniqueAuditActions = new Set();

for (var i = 0; i < tableNameArray.length; i++) {
    var oTable = new fullTableObject();
    oTable.TableName = tableNameArray[i];
    oTable.AuditAction = auditActionArray[i];
    oTable.TableRowNumber = i;

    if (uniqueTableNames.has(oTable.TableName) && 
        uniqueAuditActions.has(oTable.AuditAction)) continue;

    allTables.push(oTable);
    uniqueTableNames.add(oTable.TableName);
    uniqueAuditActions.add(oTable.AuditAction);
}
var allTables=[];
var uniqueTableNames=新集合();
var uniqueAuditActions=new Set();
对于(var i=0;i

集合的
has
函数
数组的
indexOf
更有效,因为它在内部使用哈希映射,所以我们有O(1)和O(n)。

我不确定我是否理解这个问题,但是简单地连接这两个属性来测试唯一性怎么样

您的代码如下所示:

var allTables = [];
var uniqProps = [];

for (var i = 0; i < tableNameArray.length; i++) {
    var oTable = new fullTableObject();
    oTable.TableName = tableNameArray[i];
    oTable.AuditAction = auditActionArray[i];
    oTable.TableRowNumber = i;
    var uniqProp = oTable.TableName + '#' + oTable.AuditAction;
    if(uniqProps.indexOf(uniqProp) < 0) { //test if we already have the properties in double
        uniqProps.push(uniqProp);
        allTables.push(oTable);
    }
}
var allTables=[];
var uniqProps=[];
对于(var i=0;i
您可以在for循环后执行此操作:

const allUniqueTables = allTables.reduce((res, curr) => {
                            if(res.length){
                                const isDuplicate = res.some((t) => (t.TableName === curr.TableName) 
                                                                    && (t.AuditAction == curr.AuditAction));
                                if(!isDuplicate){
                                    res.push(curr);
                                }
                            } else {
                                res.push(curr);
                            }
                            return res;
                        }, []);

这个例子向您展示了如何使用通用的可重用函数,将元组作为键。其思想是对键(现在是成对的值)进行可比较的表示,例如json字符串

var tablenemarray=['TableA','TableB','TableA'];
var auditActionArray=['ActionA','ActionA','ActionA'];
var-allTables=[];
对于(var i=0;iJSON.stringify([x.tableName,x.auditAction]);
console.log(所有表);
//类名通常大写,字段名大小写相同
函数FullTableObject(tableName、auditAction、rowNumber){
this.tableName=tableName;
this.auditAction=auditAction;
this.rowNumber=rowNumber;
}
//此函数是可重用的,不了解任何有关表和审核的知识。基本上与lodash的uniqBy相同
函数唯一性(数组,keyFn){
var keys=newset();
var结果=[];
array.forEach(函数(项){
var键=键fn(项目);
如果(!key.has(key)){
key.add(key);
结果:推送(项目);
}
});
返回结果;

}
使用布尔AND组合两个约束“TableName相同”和“AuditAction相同”?这种方法不起作用。我仍然得到多个具有相同TableName和AuditAction属性的对象。我尝试更新代码,但仍然不起作用。例如,我有TABLENAME1 | UPDATE和TABLENAME1 | INSERT,并在不应该的时候删除其中一个。这真的很奇怪。我对代码进行了测试,效果很好。这对我解决问题很有帮助。简单有效。如果有两个表,例如
{TableName:'User',AuditAction:'PermissionGrant'}
{TableName:'UserPermission',AuditAction:'Grant'}
,则此操作将失败。我建议至少使用分隔符。!添加了一个字符分隔符来解释这个@TamasHegedus。非常感谢当我尝试插入此插件时,我在这行allTables=uniqueBy(allTables,x=>JSON.stringify([x.tableName,x.auditAction])上得到一个错误;您需要运行什么级别的JS才能使其正常工作?这是ECMAScript 2015。如果需要,您可以用
函数(x){return JSON.stringify([x.tableName,x.auditAction]);}
替换lambda表达式。@MisterPositive,但是您可能在
Set
方面也有问题,这也是ES2015,我相信这就是关键所在。集合没有问题,只有lambda。再次感谢。