#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. вам нужно получить только число в качестве ключа для хэш-таблицы. пожалуйста, смотрите Редактирование.