Пройти через этот объект, который содержит массив в качестве значений, и объединить все значения, отсортировать их, переиндексировать и обновить значения

Мне нужно перебрать значения объекта и отсортировать их таким образом, чтобы удалить числа 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 02.04.2021 03:50

@jered - обновленный вопрос с кодом

dragonfly 02.04.2021 03:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете проверить этот подход. Я создал 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 {} будет иметь одинаковую информацию. Это зависит от того, какой пользователь входит. У какого-то пользователя может быть супруг, может быть ребенок или нет

dragonfly 02.04.2021 04:09

Окей, что будет если есть chid10 и test12? Какая будет их обновленная стоимость?

Sifat Haque 02.04.2021 04:12

например, давайте рассмотрим домохозяйство, в котором есть (я и 3 ребенка), тогда они индексируются как self1, child2, child3 и child4

dragonfly 02.04.2021 04:15

Давайте рассмотрим домохозяйство, в котором есть (я, супруга и 1 ребенок), тогда они будут индексироваться как self1, spouse2, child3 и child4. К self всегда будет добавляться index1. Другие индексы могут отличаться

dragonfly 02.04.2021 04:17

Итак, для (self, 3 spouse, 3 child) вывод будет (self1, spouse2, spouse3, spouse4, child5, child6, child7). Я прав?

Sifat Haque 02.04.2021 04:20

да. но согласно моему заявлению, может быть только один я и один супруг

dragonfly 02.04.2021 04:21

@dragonfly, я обновил свой ответ. Не могли бы вы проверить сейчас?

Sifat Haque 02.04.2021 04:51

этот код также должен отображаться в браузере IE9. Я взял ваше решение и изменил его. Но по-прежнему сталкиваюсь с проблемами. Если интересно, проверьте jsfiddle.net/7bga2fzw

dragonfly 02.04.2021 21:30

@dragonfly, пожалуйста, проверьте сейчас? Я думаю, что этот код должен работать и в старых браузерах.

Sifat Haque 02.04.2021 22:21

Другие вопросы по теме