Мне нужно перебрать значения объекта и отсортировать их таким образом, чтобы удалить числа 1 и 2 (назовем его индексом) из Self и Spouse. Затем переиндексируйте Child3 и Child4 в Child1 и Child2.
Хотя объект, полученный из ответа API, выглядит так, как показано ниже, имеет смысл переиндексировать их, поскольку я буду отображать эту информацию на экране.
Object looks like below: This is just a sample data. This object is dynamically created based on User household information
eligibilityMap: {
"CHIP": [
"CHILD3" // should be Child1
],
"APTC/CSR": [
"SELF1", //should be Self
"SPOUSE2", //should be Spouse
"CHILD4" //should be Child2
]
}
Мой вопрос в том, как мне пройти через этот объект и просто отсортировать дочерний элемент и переиндексировать его?
newMapping: {
"CHIP": ["Child1"],
"APTC/CSR": ["Self, Spouse and Child2"]
}
var sortedMember = Object.keys(eligibilityMap).reduce((acc, key) => {
//fetch the array for the given key
var array = eligibilityMap[key];
console.info('array', array);
var sortedArray = array.sort( function (firstValue, secondValue) {
if (firstValue.indexOf("SELF") >= 0) return -1;
if (secondValue.indexOf("SELF") >= 0) return 1;
if (firstValue.indexOf("SPOUSE") >= 0) return -1;
if (secondValue.indexOf("SPOUSE") >= 0) return 1;
return 0;
});
console.info("sortedArray", sortedArray)
acc[key] = sortedArray;
return acc;
}, {})
$scope.memberString = Object.keys(sortedMember).reduce(function (acc, key) {
var array = sortedMember[key]
var formattedString = array.reduce(function (memberAcc, member, index) {
if (member.indexOf("SELF") >= 0) {
return "Applicant"
}
if (member.indexOf("SPOUSE") >= 0) {
var delimiter = index > 0 ? ", " : "";
return memberAcc + delimiter + "Spouse"
}
if (index === 0) return member;
var delimiter = index === array.length - 1 ? " and " : ", ";
return memberAcc + delimiter + member //CHILD1
}, "");
console.info("STRING", key, formattedString)
acc[key] = formattedString;
return acc;
}, {});
СТРОКА УЧАСТНИКОВ {ЧИП: "CHILD4", APTC / CSR: "Заявитель, супруг, CHILD3 и CHILD5"}
@jered - обновленный вопрос с кодом



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете проверить этот подход. Я создал dataMapper для сопоставления конкретных данных с их новыми значениями.
var obj = {
"CHIP": [
"CHILD3", // should be Child1
],
"APTC/CSR": [
"SELF1", //should be Self
"SPOUSE2", //should be Spouse
"CHILD4" //should be Child2
],
"TEST": [
"SELF1",
"CHILD3"
]
};
// Code to support IE9
var i = 0;
var updatedObj = {};
var data = Object.keys(obj).map(function(key) {
var values = obj[key];
var memberArr = new Array();
var dataObj = values.reduce(function(store, value) {
var storeKey = value.replace(/[0-9]/g, '');
var number = Number(value.replace(/^\D+/g, ''));
if (storeKey !== 'SELF' && storeKey !== 'SPOUSE') {
var arr = new Array();
for(i = 0; i < number; i++) {
arr.push(storeKey);
memberArr.push(storeKey);
}
store[storeKey] = arr;
} else {
var anotherArr = new Array(storeKey);
memberArr.push(storeKey);
store[storeKey] = anotherArr;
}
return store;
}, {});
memberArr.sort(function(a, b) {
return b - a;
})
var sortedMemberArr = memberArr.map(function(member, index) {
return member+''+(index+1);
})
updatedObj[key] = sortedMemberArr;
})
console.info(updatedObj)
/*
// Code Using Modern Syntax
const data = Object.entries(obj).map(([key, value]) => {
const memberCount = value.reduce((store, val) => {
const key = val.replace(/[0-9]/g, '');
const number = +val.replace(/^\D+/g, '');
if (!['SELF', 'SPOUSE'].includes(key)) {
store[key] = Array(number).fill(key);
} else {
store[key] = [key];
}
return store;
}, {})
const sortedMembers = Object.values(memberCount).flat().sort((a, b) => b - a);
const sortedMembersWithNumber = sortedMembers.map((member, index) => `${member}${index+1}`)
return [key, sortedMembersWithNumber]
})
const updatedObj = Object.fromEntries(data);
console.info(updatedObj)
*/Я не могу жестко запрограммировать значения. Эти ценности динамичны. Не всегда eligibilityMap {} будет иметь одинаковую информацию. Это зависит от того, какой пользователь входит. У какого-то пользователя может быть супруг, может быть ребенок или нет
Окей, что будет если есть chid10 и test12? Какая будет их обновленная стоимость?
например, давайте рассмотрим домохозяйство, в котором есть (я и 3 ребенка), тогда они индексируются как self1, child2, child3 и child4
Давайте рассмотрим домохозяйство, в котором есть (я, супруга и 1 ребенок), тогда они будут индексироваться как self1, spouse2, child3 и child4. К self всегда будет добавляться index1. Другие индексы могут отличаться
Итак, для (self, 3 spouse, 3 child) вывод будет (self1, spouse2, spouse3, spouse4, child5, child6, child7). Я прав?
да. но согласно моему заявлению, может быть только один я и один супруг
@dragonfly, я обновил свой ответ. Не могли бы вы проверить сейчас?
этот код также должен отображаться в браузере IE9. Я взял ваше решение и изменил его. Но по-прежнему сталкиваюсь с проблемами. Если интересно, проверьте jsfiddle.net/7bga2fzw
@dragonfly, пожалуйста, проверьте сейчас? Я думаю, что этот код должен работать и в старых браузерах.
что ты уже испробовал?