Это последующая запись из сравнения значений ключа внутри объекта для дублирования для последующего ответа.
У меня есть объект:
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"]
]
Проблема, с которой я сталкиваюсь, заключается в том, что, хотя это работает, если есть два совпадающих ключа, это не сработает (правильно), если их три или более.
Если вы хотите иметь массив всех совпадений для каждого ключа на карте, вам нужно начать с установки массива, когда вы найдете ключ в первый раз. В последующих матчах просто нажмите на этот массив:
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()
до карты с только значениями длины больше единицы, что и делает последний бит в фрагменте.