0

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

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

为简单起见,它看起来像这样。

var p =   { };
 p =
    {
        "p1": "value1",
        "p2": "value2",
        "p3": "value3",
        "p4": "value2",
        "p5": "value3",
        "p6": "value5"
    };

我怎样才能做到这一点。

这是js小提琴。

jsfiddle

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

有什么想法可以完成这项工作吗?

4

3 回答 3

2

我能想到的最简单的方法是遍历您当前的对象,并标记您看到的每个值。当您再次看到一个值时,标记该键。

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(', '));
    }
}

演示:http: //jsfiddle.net/bjRDK/

于 2013-09-19T23:04:21.767 回答
2

@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;
    }
}

这只是给你一个带有欺骗的键列表。(注意 - 重复值的第一个实例在这里不被视为重复值。)

于 2013-09-19T23:07:06.890 回答
2
var p =
    {
        "p1": "value1",
        "p2": "value2",
        "p3": "value3",
        "p4": "value2",
        "p5": "value3",
        "p6": "value5"
    };

var q = {};
var keys = Object.keys(p);
for (var i = 0; i < keys.length; i++) {
    var currentKey = keys[i];
    var newKey = p[currentKey];
    if (q[newKey] === undefined){
        q[newKey] = [];
    }
    q[newKey].push(currentKey);
}

这会让你得到一个看起来像这样的对象:

{
  "value1": ["p1"],
  "value2": ["p2","p4"],
  "value3": ["p3","p5"],
  "value5": ["p6"]
}
于 2013-09-19T23:09:14.907 回答