我有一个javascript关联数组。它将动态填充。
我想找到包含重复数据/值的键。
为简单起见,它看起来像这样。
var p = { };
p =
{
"p1": "value1",
"p2": "value2",
"p3": "value3",
"p4": "value2",
"p5": "value3",
"p6": "value5"
};
我该怎么做。
这是js小提琴。
除了使用hasOwnProperty还有其他方法吗?
任何使这项工作成功的想法?
答案 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(', '));
}
}
答案 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"]
}