Как проверить отсутствующее значение в массиве объектов и добавить это отсутствующее значение со специальными символами

В настоящее время я проверяю отсутствующие значения массива объектов по значениям объекта, и это работает хорошо, если я использую числа или строковые числа. Но в некоторых случаях отсутствующим значением будет номер строки со специальным символом. Я попытался разделить заданное значение и взять число, а затем проверить, отсутствует ли это значение, но затем я застрял в назначении этого специального символа обратно значению. Это код того, что я пробовал до сих пор

const one = '<0';
const two = '20+';

const data = [
    { key: 1, value: 0 },
  { key: 2, value: 0 },
  { key: 3, value: 0 },
  { key: 7, value: 0 },
  { key: 8, value: 0 },
]

const min = one.split(/([0-9]+)/);
const max = two.split(/([0-9]+)/);

const numbersArr = new Array(+max[1]);
  for (let i = +min[1]; i <= +max[1]; i++) {
    numbersArr[i] = i;
  }
  const missingLabels = numbersArr.filter(
    (itemOne) => !data.some((itemTwo) => itemTwo.key == `${min[0].length>0 && +min[1] === itemOne ? min[0] : ''}${itemOne}${max[2].length>0 && +max[1] === itemOne ? max[2] : ''}`)
  );
 missingLabels.map((item) => {
    data.push({ key: `${min[0].length>0 ? min[0].length : null}${item}`, value: 0 });
  });

console.info(data)

и ожидаемый результат должен быть [{key: '<0', value: 0}, {key: '1', value: 0}, ... {key: '20+', value:0}] Что я делаю не так, и как мне решить мою проблему? Любой пример будет оценен!

Данные должны быть заполнены отсутствующими значениями, включая константы one и two.

Milos 11.12.2020 14:03
Поведение ключевого слова "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) для оценки ваших знаний,...
2
1
636
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете сопоставить min и max и взять данные в хэш-таблицу для сопоставления либо известных ключей, либо добавления новых объектов.

Для разыскиваемых ключей вы можете распространять объект с новым ключом.

const
    getValue = v => +v.toString().match(/\d+/)[0],
    one = '<0',
    two = '20+',
    data = [{ key: '<0', value: 0 }, { key: 2, value: 0 }, { key: 3, value: 0 }, { key: 7, value: 0 }, { key: 8, value: 0 }, { key: '20+', value: 0 }],
    min = getValue(one),
    max = getValue(two),
    getKey = k => ({ [min]: one, [max]: two }[k] || k),
    keys = data.reduce((r, o) => (r[getValue(o.key)] = o, r), {}),
    result = Array.from(
        { length: max - min + 1 },
        (_, i) => ({ key: null, value: 99, ...keys[min + i], key: getKey(min + i) })
    );

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Спасибо за ответ и время, но мой результат должен быть таким [{key: '<0', value: 0}, {key: '1', value: 0}, ... {key: '20+', value:0}]. Таким образом, данные будут включать специальные символы :(

Milos 11.12.2020 14:24

но он должен принимать значение для нуля rsp 20?

Nina Scholz 11.12.2020 14:25

Я не понимаю вашего вопроса. Если исходные данные отсутствуют <0, мы должны добавить его к нему как новый объект, а также, если исходные данные отсутствуют 20+, мы должны добавить его к нему как новый объект. Так что ожидаемый результат будет [{key: '<0', value: 0}, {key: '1', value: 0}, {key: '2', value: 0}, ... {key: '20+', value:0}]

Milos 11.12.2020 14:31

Да, это то, что я искал. Большое спасибо!

Milos 11.12.2020 14:39

если вы не возражаете против порядка клавиш, вы можете уменьшить функцию сопоставления до (_, i) => ({ value: 99, ...keys[min + i], key: key(min + i) }).

Nina Scholz 11.12.2020 14:42

На самом деле мне нужно, чтобы они были в порядке возрастания, но спасибо за ваше предложение!

Milos 11.12.2020 15:02

Извините, что беспокою вас, но что, если в массиве data есть этот объект { key: '20+', value: 25}, и если мы сделаем эту проверку, она переопределит значение от 25 до 99. Есть идеи, как этого избежать? Спасибо

Milos 11.12.2020 15:36

вам нужно получить только число в качестве ключа для хеш-таблицы. см. редактирование.

Nina Scholz 11.12.2020 17:58

Да, это то, что я искал. Спасибо большое, Нина!

Milos 11.12.2020 18:07

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