对象重复内比较键值(Compare key values within object for dup

2019-09-29 09:07发布

我有一个对象:

myObj = {
  attendent-0-id:"123",
  attendent-0-name:"Bob Smith",
  attendent-1-id:"1234",
  attendent-1-name:"Alex Smith",
  attendent-2-id:"123",
  attendent-2-name:"Charlie Smith",
  attendent-maxGuest:1,
  attendent-party-name:"",
}

我需要创建一个循环,通过去myObj ,找到所有的ID,然后比较它们的重复。 因此,在这种情况下,因为它会记录一个错误attendent-0-id等于attendent-2-id

如果我找到重复的,我需要一个标志设置为true;

我已经尝试了一堆东西,和我只是停留在这一点上。 谢谢你的帮助。

Answer 1:

在你的情况你可以通过myObj使用Object.keys()通过:

for (const key of Object.keys(obj))

使用普通的对象作为地图存储ID的先前值:

const map = {};

使用正则表达式模式,使只有确定具体的IDS进行评估:

const pattern = /^attendent-\d+-id$/;

再搭配上的帮助map ,登录重复的ID错误:

if (value in map) {
  console.error(`${map[value]} is equal to ${key}, which is ${value}`);        
}

例:

 const myObj = { 'attendent-0-id': "123", 'attendent-0-name': "Bob Smith", 'attendent-1-id': "1234", 'attendent-1-name': "Alex Smith", 'attendent-2-id': "123", 'attendent-2-name': "Charlie Smith", 'attendent-maxGuest': 1, 'attendent-party-name': "", }; function errorOnDuplicateIds(obj) { const map = {}; const pattern = /^attendent-\d+-id$/; for (const key of Object.keys(obj)) { if (pattern.test(key)) { const value = obj[key] if (value in map) { console.error(`${map[value]} is equal to ${key}, which is ${value}`); } else { map[value] = key } } } } errorOnDuplicateIds(myObj); 



Answer 2:

const ids = []; // keep track of found ids
Object.keys(myObj).forEach(key => { // iterate over all properties of myObj
    // check if property name is in format "attendent-" *some number* "-id"
    if (/^attendent-\d+-id$/.test(key)) {
        // check if the id has already been found
        if (ids.findIndex(id => id === myObj[key]) !== -1) {
            console.log('error');
        } else {
            ids.push(myObj[key]);
        }
    }
});


Answer 3:

您可以使用Object.entriesMap这个(按价值键控):

 var myObj = {"attendent-0-id":"123","attendent-0-name":"Bob Smith","attendent-1-id":"1234","attendent-1-name":"Alex Smith","attendent-2-id":"123","attendent-2-name":"Charlie Smith","attendent-maxGuest":1, "attendent-party-name":""}; var dupes = [...Object.entries(myObj).reduce( (map, [key,val]) => map.set(val, (map.get(val) || []).concat(key)), new Map ).values()].filter(keys => keys.length > 1); console.log(dupes); 

这个解决方案没有给出任何具体意义的键的格式。

说了这么多,你的对象结构看起来可疑不良设计的:你不应该在你的对象键枚举。 对于您应该使用数组。



Answer 4:

Object.values(myObj)将创建所有值的数组,然后你可以使用任何方式来查找数组中重复的元素。

var myValues = Object.values(myObj); //This will create an array of all values
var uniq = myValues.map((val) => {
  return {count: 1, val: val}
}).reduce((a, b) => {
  a[b.val] = (a[b.val] || 0) + b.count
  return a
}, {});
var duplicates = Object.keys(uniq).filter((a) => uniq[a] > 1)
if (duplicates.length) {
   return true;
} else {
   return false;
}


Answer 5:

我的第一个建议是你的对象重新定义的东西更灵活。

let myObject = {
    attendants : [
        { 
            id: "123",
            name: "Bob Smith"
        },
        { 
            id: "456",
            name: "Alex Smith"
        },
        { 
            id: "768",
            name: "Charlie Smith"
        },           
    ],
    maxGuest: 1,
    partyName: ""
};

这将允许您遍历服务员。

for (var attendant in myObject.attendants){
     doSomething(attendant.id, attendant.name);
}

您也可以排序随之而来:

// Sort by id 
myObject.attendants.sort(function(left, right){
    return left.value - right.value;
});

// Sort by name
myObject.attendants.sort(function (left, right){
    var leftName = left.name.toLowerCase();
    var rightName = right.name.toLowerCase();

    if (leftName < rightName) return -1;
    if (leftName > rightName) return 1;
    return 0;
});

现在,让我们假设你没有选择。 然后,它变得复杂。

您需要创建(或修改存在的)一种算法,它可以使用作为生成的密钥:

myObject[`attendent-${index}-id`]
myObject[`attendent-${index}-name`]

并保持对



文章来源: Compare key values within object for duplicate