javascript:获取关联数组中包含重复数据的键

javascript:获取关联数组中包含重复数据的键,javascript,arrays,key,Javascript,Arrays,Key,我有一个javascript关联数组。它将动态填充 我想找到包含重复数据/值的键 为简单起见,它将如下所示 var p = { }; p = { "p1": "value1", "p2": "value2", "p3": "value3", "p4": "value2", "p5": "value3", "p6": "value5" }; 我怎样才能做到这一点 这是js小提琴

我有一个javascript关联数组。它将动态填充

我想找到包含重复数据/值的键

为简单起见,它将如下所示

var p =   { };
 p =
    {
        "p1": "value1",
        "p2": "value2",
        "p3": "value3",
        "p4": "value2",
        "p5": "value3",
        "p6": "value5"
    };
我怎样才能做到这一点

这是js小提琴

除了使用hasOwnProperty,还有其他方法吗


有什么办法可以让它工作吗?

我能想到的最简单的方法是在当前对象中循环,并标记您看到的每个值。再次看到值时,请标记该键

var tmp = {};
for(var i in p){
    var val = p[i];

    // Have we seen this value before?
    if(!tmp.hasOwnProperty(val)){
        // Mark the value as seen for the first time
        tmp[val] = []; // 0 duplicates
    }
    else{
        // We've seen it before, save the duplicate key
        tmp[val].push(i);
    }
}

// Print out values and their duplicate keys
for(var i in tmp){
    var keys = tmp[i];

    // Are there any duplicates?
    if(keys.length){
        alert(i + ' has multiple keys: '+keys.join(', '));
    }
}

演示:

我能想到的最简单的方法是在当前对象中循环,并标记您看到的每个值。再次看到值时,请标记该键

var tmp = {};
for(var i in p){
    var val = p[i];

    // Have we seen this value before?
    if(!tmp.hasOwnProperty(val)){
        // Mark the value as seen for the first time
        tmp[val] = []; // 0 duplicates
    }
    else{
        // We've seen it before, save the duplicate key
        tmp[val].push(i);
    }
}

// Print out values and their duplicate keys
for(var i in tmp){
    var keys = tmp[i];

    // Are there any duplicates?
    if(keys.length){
        alert(i + ' has multiple keys: '+keys.join(', '));
    }
}

演示:

稍微紧凑一点的@RocketHazmat解决方案:

var values = {},
    dupes = [],
    key,
    val;
for (key in p) {
    if (p.hasOwnProperty(key)) {
        val = p[key];
        if (values[val]) dupes.push(key);
        else values[val] = true;
    }
}

这只是给你一个重复键的列表。(注意-此处dupe值的第一个实例不被视为dupe。)

稍微紧凑的@RocketHazmat解决方案版本:

var values = {},
    dupes = [],
    key,
    val;
for (key in p) {
    if (p.hasOwnProperty(key)) {
        val = p[key];
        if (values[val]) dupes.push(key);
        else values[val] = true;
    }
}


这只是给你一个重复键的列表。(注意-此处dupe值的第一个实例不被视为dupe。)

您不能有两个
p5
键!第二个将覆盖第一个。好像它根本就不在那里。这不是“关联数组”,而是“对象”。抱歉,修复了重复键问题。
hasOwnProperty
无法帮助您查找重复值。检查对象是否有特定的“键”。您的问题是什么?您不能有两个
p5
键!第二个将覆盖第一个。好像它根本就不在那里。这不是“关联数组”,而是“对象”。抱歉,修复了重复键问题。
hasOwnProperty
无法帮助您查找重复值。这会检查一个物体是否有特定的“钥匙”。你的问题是什么?谢谢你的回答,非常感谢你的帮助。我不知道是把你的答案标记为已接受答案还是nrabinowitz。你的使用两个循环,而nrabinowitz使用一个。但你先回答了。最后我想要的就是这些键,但是如果我去掉i+,它有多个键:'最后我得到了这些键,等等。他的解决方案也会让人受骗,等等。在这里要公平点,@Nomad:选一个你更喜欢的/对你更合适的。谁先发帖并不重要。接受答案的意义在于选择你认为“最好”的答案,而不管是谁发的,什么时候发的:-)我发的。非常感谢你的时间和帮助,我真的非常感谢。我更喜欢另一种解决方案,希望你不会介意。再次非常感谢。谢谢你的回答,非常感谢你的帮助。我很纠结是把你的回答标为被接受还是纳拉比诺维茨。你的使用两个循环,而nrabinowitz使用一个。但你先回答了。最后我想要的就是这些键,但是如果我去掉i+,它有多个键:'最后我得到了这些键,等等。他的解决方案也会让人受骗,等等。在这里要公平点,@Nomad:选一个你更喜欢的/对你更合适的。谁先发帖并不重要。接受答案的意义在于选择你认为“最好”的答案,而不管是谁发的,什么时候发的:-)我发的。非常感谢你的时间和帮助,我真的非常感谢。我更喜欢另一种解决方案,希望你不会介意。再次非常感谢你的回答,非常感谢你的帮助。我把小提琴加在这里了。您也可以将作业放在括号内:
if(values[val=p[key]])
,甚至更短。非常感谢您的回答,非常感谢您的帮助。我把小提琴加在这里了。您还可以将赋值放在括号内:
if(values[val=p[key]])
,甚至更短。