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

时间:2013-09-19 22:49:04

标签: javascript arrays key

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

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

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

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

我该怎么做。

这是js小提琴。

jsfiddle

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

任何使这项工作成功的想法?

3 个答案:

答案 0 :(得分: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(', '));
    }
}

DEMO:http://jsfiddle.net/bjRDK/

答案 1 :(得分: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;
    }
}

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

答案 2 :(得分: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"]
}