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

#javascript #arrays #ecmascript-6

#javascript #массивы #ecmascript-6

Вопрос:

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

 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 amp;amp;  min[1] === itemOne ? min[0] : ''}${itemOne}${max[2].length>0 amp;amp;  max[1] === itemOne ? max[2] : ''}`)
  );
 missingLabels.map((item) => {
    data.push({ key: `${min[0].length>0 ? min[0].length : null}${item}`, value: 0 });
  });

console.log(data) 

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

Комментарии:

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

Ответ №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.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

Комментарии:

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

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

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

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

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