Я получаю данные, в которых многие поля пусты, и мне нужно что-то заполнить, если поле пусто.
как в данных ниже
{ //...
IGM_ETD: '2021-11-27T23:59:00+05:00',
milestatus: null,
transit_depart: null,
etd_atd: null,
// around 200+ fields
}
Как и здесь, transport_depart равен нулю, я использую тернарный оператор, чтобы вернуть что-то, если данные равны нулю, как это;
// this is a reproducible example.
// there are some other styles and comp to display if/else part
{transit_depart ? <>{transit_depart}</> : <>Not Available<>}
Это работает, как и ожидалось, но проблема в том, что у меня есть около 200+ таких полей, и если я буду следовать этому, то в будущем, если нам придется внести какие-либо изменения в пользовательский интерфейс, мы будем менять весь соответствующий код здесь. Итак, как этого избежать или как мы можем справиться с этим.
Это один объект со всеми этими типами разных полей, как мне это сопоставить?
Получение ключей через object.keys() должно получить все поля. Доступ к obj.key списка ключей должен получить все значения. Просто используйте сравнение после получения значений, чтобы увидеть, нужно ли вам заменить значение или нет.
Я бы настоятельно предостерег вас от использования сплошных заполнителей для всех полей. null полезен тем, что показывает, что для этого ключа не задано значение. Если вы только начнете заполнять данные, вы можете ввести неправильный тип данных (например, строку, где требуется число), и вы не сможете определить, какие поля имеют «настоящие» значения, а какие автоматически заполняются. -ins.
Я вижу много ответов, показывающих функцию карты, например эту, но что, если у меня есть некоторые поля, в которых я не хочу использовать один и тот же стиль, который будет отображаться для всех полей. ? Или, скажем, хочу ли я исключить некоторые из них с помощью этой функции карты?
Вы можете сделать следующее, чтобы очистить код:
const incommingData = {
IGM_ETD: '2021-11-27T23:59:00+05:00',
milestatus: null,
transit_depart: null,
etd_atd: null,
};
// Generic function component for field
const Field = ({ data }) => {
if (isMySpecifcField) {
return <SpecificFieldComponent />;
}
return data ? data : 'Not Available';
};
// rendering the fields
{
Object.keys(incommingData).map((fieldData) => {
return <Field data = {fieldData} />;
});
}
Фрагмент приводит к ошибке. Пожалуйста, проверьте, возможно.
Плохо, это не исполняемый фрагмент. Цель состояла в том, чтобы дать представление о том, как улучшить. Я обновил форматирование
Нет проблем, если это не работает здесь, я понял, я вижу много ответов, показывающих функцию карты, например, но что, если у меня есть некоторые поля, в которых я не хочу использовать один и тот же стиль, который будет отображаться для всех полей. ? Или, скажем, хочу ли я исключить некоторые из них с помощью этой функции карты?
Вы совершенно правы в этом вопросе. И да, в этом случае с моим решением это было бы невозможно. Но я сделал это, чтобы решить конкретную упомянутую проблему I have around 200+ fields like this and if I follow this then in the future if we have to make any UI change then we will be changing all the relevant code
. Преимущество использования предложенного мной решения заключается в том, что в следующий раз, когда у вас будет изменение пользовательского интерфейса, вам не придется переходить к каждому из этих 200 полей (конечно, общее изменение пользовательского интерфейса. что-то, что применимо ко всем полям сразу)
По сути, когда вы сказали changing all the relevant code
, я предположил, что всем 200 потребуется изменение пользовательского интерфейса одновременно.
@atropabelladona Я обновил код для поддержки определенных полей и возврата компонента в пользовательском стиле.
Просто перебирайте свои данные, проверяя каждое значение по ходу дела.
var data = {
IGM_ETD: '2021-11-27T23:59:00+05:00',
milestatus: null,
transit_depart: null,
etd_atd: null,
// around 200+ fields
}
for(let prop in data)
{
console.info(data[prop] ? `<>${data[prop]}</>` : "<>Not Available<>" );
}
Просто используйте оператор ИЛИ:
<>{transit_depart || 'Not Available'}</>
Если transit_depart
определено, будет использоваться значение. Если нет, он будет использовать 'Not available'
.
Проблема с предыдущим решением заключается в том, что 0
также будет опущен, поскольку оно ложно. Чтобы избежать этого, вы можете использовать Нулевой объединяющий оператор (проверьте, поддерживает ли это ваша среда):
<>{transit_depart ?? 'Not Available'}</>
Один из вариантов создает функцию для проверки:
const itsAvailable = (value) => {
return value ?? 'Not Available'
}
console.info(itsAvailable(null)) // will return Not Available
console.info(itsAvailable(34)) // wil return 34
А затем просто сопоставьте объект вот так
{ Object.keys(<your object>).map(field=> itsAvailable(<your object>[field]) )
Я думаю, вы можете сделать следующее
const incommingData = {
IGM_ETD: '2021-11-27T23:59:00+05:00',
milestatus: null,
transit_depart: null,
etd_atd: null,
};
const notAvailableMessage = 'Not Available'
// rendering the fields
function Compoennt() {
return (
<div>
Field 1: {incomingData.field1 || notAvailableMessage}
Field 2: {incomingData.field2 || notAvailableMessage}
Field 3: {incomingData.field3 || notAvailableMessage}
</div>
)
}
Вы можете попробовать этот.
var data = {
IGM_ETD: '2021-11-27T23:59:00+05:00',
milestatus: null,
transit_depart: null,
etd_atd: null,
// around 200+ fields
}
Object.keys(data).forEach(x => {
if (!data[x])
data[x] = '<>Not Available<>'
});
console.info(data)
Допустим, это наш объект:
let transitData = { //...
IGM_ETD: '2021-11-27T23:59:00+05:00',
milestatus: null,
transit_depart: null,
etd_atd: null,
// around 200+ fields
}
Прокрутите values
, проверьте, есть ли null
. Если нет null
, вы можете получить доступ к данным следующим образом:
return(
<div>
{Object.values(transitData).map((value, i) => value === null ? 'Value is Null' : console.info(Object.keys(transitData)[i], value))}
</div>
)
Теперь, если вы хотите явно стилизовать определенный field
, вам нужно создать собственную функцию проверки для этого. Вот пример того, как это может выглядеть:
const customFieldStyle = (fieldName, value) => {
if (fieldName === 'milestatus'){
return <span id = {custom_mile_styler}>{value}</span>
} else {
// this is where you'll put your default style
return <span id = {default_field_styler}>{value}</span>
}
}
И теперь это будет выглядеть так в рендере:
return(
<div>
{Object.values(transitData).map((value, i) => value === null ? 'Value is Null' : customFieldStyle(Object.keys(transitData)[i], value)}
</div>
)
Эта функция возьмет ВСЕ пары key/value
, которые не являются null
, и украсит их соответствующим образом. Просто добавьте больше условных выражений для явных имен полей в customFieldStyle
и визуализируйте любой тип стиля, который вы хотите, используя ваш выбор CSS
и JSX
.
Я вижу много ответов, показывающих функцию карты, например эту, но что, если у меня есть некоторые поля, в которых я не хочу использовать один и тот же стиль, который будет отображаться для всех полей. ? Или, скажем, хочу ли я исключить некоторые из них с помощью этой функции карты?
В этот момент я бы сделал собственный валидатор, явно проверяющий определенные поля. И оттуда вы можете создавать собственные стили для определенных полей. Я покажу вам пример выше — дайте мне несколько.
@atropabelladona Я добавил пользовательскую функцию стиля и объяснил, как вы будете отображать разные результаты. Дайте мне знать, что вы думаете.
Замена недоступных данных значением по умолчанию требует предварительного анализа. Скорее всего, многие поля могут иметь разные значения по умолчанию.
Например, 0
для определенных сумм; now
на одни даты, а first day of the year
на другие; " "
, "TBD"
или "N/A"
для некоторых строк...
Вам нужен метод для сопоставления некоторых полей с определенными значениями по умолчанию для этих полей и окончательное значение по умолчанию для остальных полей.
Для предоставленных образцов данных
let data = {
IGM_ETD: '2021-11-27T23:59:00+05:00',
milestatus: null,
transit_depart: null,
etd_atd: null
}
мы можем захотеть, чтобы milestatus
по умолчанию было равно 0, transit_depart
по умолчанию было 1 января 2021 года, а все остальные поля по умолчанию были равны "N/A"
; мы могли бы определить объект по умолчанию
{
milestatus: 0,
transit_depart: new Date('2021-01-01')
}
и функция setDefaults
для сопоставления полей данных со значениями по умолчанию.
function setDefaults(data) {
const someDefaults = {
milestatus: 0,
transit_depart: new Date('2021-01-01')
}
const theDefault = "N/A";
for (const [key, value] of Object.entries(data)) {
if (value==null) {
if (someDefaults[key]!=null) {
data[key] = someDefaults[key]
} else {
data[key] = theDefault;
}
}
}
return data;
}
запуск функции по образцу данных
setDefaults(data)
преобразовал бы data
, чтобы содержать
{
IGM_ETD:"2021-11-27T23:59:00+05:00",
milestatus:0,
transit_depart:"2021-01-01T00:00:00.000Z",
etd_atd:"N/A"
}
Вы можете получить список ключей объекта.
map
их, посмотрите, является ли obj.key нулевым. Если null, верните то, что вам нужно, чтобы заменить vale, иначе верните то же значение.