В настоящее время я проверяю отсутствующие значения массива объектов по значениям объекта, и это работает хорошо, если я использую числа или строковые числа. Но в некоторых случаях отсутствующим значением будет номер строки со специальным символом. Я попытался разделить заданное значение и взять число, а затем проверить, отсутствует ли это значение, но затем я застрял в назначении этого специального символа обратно значению. Это код того, что я пробовал до сих пор
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}]
Что я делаю не так, и как мне решить мою проблему? Любой пример будет оценен!
Вы можете сопоставить 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}]
. Таким образом, данные будут включать специальные символы :(
но он должен принимать значение для нуля rsp 20?
Я не понимаю вашего вопроса. Если исходные данные отсутствуют <0
, мы должны добавить его к нему как новый объект, а также, если исходные данные отсутствуют 20+
, мы должны добавить его к нему как новый объект. Так что ожидаемый результат будет [{key: '<0', value: 0}, {key: '1', value: 0}, {key: '2', value: 0}, ... {key: '20+', value:0}]
Да, это то, что я искал. Большое спасибо!
если вы не возражаете против порядка клавиш, вы можете уменьшить функцию сопоставления до (_, i) => ({ value: 99, ...keys[min + i], key: key(min + i) })
.
На самом деле мне нужно, чтобы они были в порядке возрастания, но спасибо за ваше предложение!
Извините, что беспокою вас, но что, если в массиве data
есть этот объект { key: '20+', value: 25}
, и если мы сделаем эту проверку, она переопределит значение от 25 до 99. Есть идеи, как этого избежать? Спасибо
вам нужно получить только число в качестве ключа для хеш-таблицы. см. редактирование.
Да, это то, что я искал. Спасибо большое, Нина!
Данные должны быть заполнены отсутствующими значениями, включая константы
one
иtwo
.