قارن القيم الرئيسية داخل الكائن للتكرار

1

لدي كائن:

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 والعثور على جميع المعرفات ثم مقارنتها بالنسخ المكررة. لذلك في هذه الحالة سيسجل خطأ لأنه attendent-0-id يساوي attendent-2-id .

إذا وجدت تكرارات فأنا بحاجة إلى تعيين إشارة إلى true ؛

لقد حاولت مجموعة من الأشياء وأنا فقط عالقة في هذه المرحلة. شكرا على اي مساعدة.

5 الردود

1
افضل جواب

في قضيتك يمكنك المرور myObj باستخدام Object.keys () عبر:

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

استخدام كائن عادي كخريطة لتخزين القيم السابقة للمعرفات:

const map = {};

استخدم نمط التعبير العادي للتأكد من أن المعرفات المحددة فقط هي التي يتم تقييمها:

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

ثم بمساعدة map ، سجل الخطأ في المعرفات المكررة:

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);

:مؤلف
0

نصيحتي الأولى هي إعادة تعريف الشيء الخاص بك إلى شيء أكثر مرونة.

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`]

والحفاظ على الزوج

:مؤلف
0

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;
}
:مؤلف
0

يمكنك استخدام Object.entries و Map (مرتبطًا بالقيمة) لهذا:

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);

لا يعطي هذا الحل أي معنى خاص لتنسيق المفاتيح.

بعد قولي هذا ، تبدو بنية الكائن لديك مشبوهة من التصميم السيئ: لا يجب أن يكون لديك تعدادات في مفاتيح الكائن. لذلك يجب عليك استخدام المصفوفات.

:مؤلف
0
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]);
        }
    }
});
:مؤلف
فوق
قائمة طعام