Сравнить ключевые значения в объекте для дубликата обновлено

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-0-id:"123",
  attendent-0-name:"John Smith",
  attendent-maxGuest:1,
  attendent-party-name:"",
}

Благодаря помощи здесь (Рик) я смог получить 90% пути.

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) {
        map[value] = [map[value], key];       
      } else {
        map[value] = key
      }
    }    
  }
return map;
}

Я получаю возвращение:

array:[
  0:(2) ["attendent-0-name", "attendent-1-name"]
  1:"attendent-2-name"
]

но я ищу:

array:[
  0:(2) ["attendent-0-name", "attendent-1-name", "attendent-2-name"]
]

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя это работает, если есть два совпадающих ключа, это не сработает (правильно), если их три или более.

  • 1
    Я считаю, что вы должны были отредактировать свой оригинальный вопрос, а не создавать другой.
  • 0
    Похоже, вы не должны были принять ответ, который не работает?
Показать ещё 4 комментария
Теги:
ecmascript-6

1 ответ

2
Лучший ответ

Если вы хотите иметь массив всех совпадений для каждого ключа на карте, вам нужно начать с установки массива, когда вы найдете ключ в первый раз. В последующих матчах просто нажмите на этот массив:

const myObj = {'attendent-0-id': "1234",'attendent-0-name': "Bob Smith",'attendent-1-id': "123",'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) {
        map[value].push(key); // push a new value 
      } else {
        map[value] = [key] // set it to an array
      }
    }
  }

  /* if you only want lengths > 1
     otherwise just return map   */
  let filtered = Object.entries(map)
    .reduce((a, [key, value]) =>  value.length > 1 ? Object.assign(a, {[key]: value}) : a, {})

  return filtered;
}

console.log(errorOnDuplicateIds(myObj));

Если вас интересуют только значения с более чем одним ударом, вы можете reduce() до карты с только значениями длины больше единицы, что и делает последний бит в фрагменте.

  • 0
    Ах, это прекрасно работает.
  • 0
    Отлично @RyleyAmeden, обратите внимание, что это вернет все значения, даже те, которые имеют только один идентификатор. Я добавил редактирование, показывающее быстрый способ фильтрации только по обманам.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню