#javascript #node.js #json #object
Вопрос:
Есть ли лучший способ сделать это с помощью обычного javascript или с помощью пакета lodash. Я чувствую, что этот код немного уродлив и нарушает СУХОЙ принцип.
{
hotelName : 'abc',
starRating : '',
contactName : 'xyz',
phoneNumber : '917777777777',
address : 'my address',
city : 'a city',
placeForSearch : 'dnjwjn',
postalCode : '888888',
parking : 'No',
breakfast : 'Yes, Free',
facilities : [ 'Garden', 'Restaurant', 'Terrace' ],
extraBed : 'Yes',
noOfExtraBeds : '2',
freeCancellationAvailable : 'Day of arrival',
ifNotCancelledBeforeDate : 'of the first day',
checkIn : '00 : 00',
checkOut : '00 : 00',
accomodateChildren : 'No',
allowPets : 'No',
provideDormitoryForDriver : 'No',
isPrepaymentRequired : 'No',
GST : 'No',
tradeName : '',
GSTIN : '',
panCardNumber : '',
state : '',
mainPhoto : 'public/abc/1622985481065880430129042agra.jpeg',
photos : [
'public/abc/1622985481065286597229809mumbai.jpg',
'public/abc/1622985481066077551094770munnar.jpg',
'public/abc/1622985481066392466455226mysore.jpg'
]
}
Примечание: Здесь только некоторые из «Нет» или «Да» должны быть преобразованы в логическое значение, поэтому я не могу зацикливать объекты.
использование деструкции объектов также не работает.
fields.extraBed=fields.extraBed==="No"?false:true
fields.accomodateChildren=fields.accomodateChildren==="No"?false:true
fields.allowPets=fields.allowPets==="No"?false:true
fields.isPrepaymentRequired=fields.isPrepaymentRequired==="No"?false:true
fields.provideDormitoryForDriver=fields.provideDormitoryForDriver==="No"?false:true
fields.GST=fields.GST==="No"?false:true
Комментарии:
1. Совет — каждый раз , когда вы проверяете условие, а затем возвращаете
true
илиfalse
, вы можете заменить его условием, так как оно также возвращаетtrue
илиfalse
. В лучшем случае вам придется это отрицать.x === "No"?false:true
это то жеx !== "No"
самое, что .2. ты забыл
parking
ключ3. нет @MisterJojo Я намеренно оставил это, потому что парковка принимает одно из 3 значений («Нет», «Да, бесплатно», «Да, платно»).
Ответ №1:
Создайте массив ключей, который вы хотите преобразовать, а затем уменьшите его, используя исходный объект в качестве начального значения:
const booleanKeys = ['extraBed', 'accomodateChildren', 'allowPets', 'isPrepaymentRequired', 'provideDormitoryForDriver', 'GST']
const transform = obj =>
booleanKeys.reduce((acc, key) => ({
...acc,
[key]: obj[key] === 'Yes'
}), obj)
const obj = {"hotelName":"abc","starRating":"","contactName":"xyz","phoneNumber":"917777777777","address":"my address","city":"a city","placeForSearch":"dnjwjn","postalCode":"888888","parking":"No","breakfast":"Yes, Free","facilities":["Garden","Restaurant","Terrace"],"extraBed":"Yes","noOfExtraBeds":"2","freeCancellationAvailable":"Day of arrival","ifNotCancelledBeforeDate":"of the first day","checkIn":"00 : 00","checkOut":"00 : 00","accomodateChildren":"No","allowPets":"No","provideDormitoryForDriver":"No","isPrepaymentRequired":"No","GST":"No","tradeName":"","GSTIN":"","panCardNumber":"","state":"","mainPhoto":"public/abc/1622985481065880430129042agra.jpeg","photos":["public/abc/1622985481065286597229809mumbai.jpg","public/abc/1622985481066077551094770munnar.jpg","public/abc/1622985481066392466455226mysore.jpg"]}
const result = transform(obj)
console.log(result)
Ответ №2:
let result = Object.entries(inputObject)
.map(([k,v]) => [k,v === 'Yes'? true : v === 'No' ? false : v]);
console.log(result);
Ответ №3:
Используйте Object.entries(), например:
let obj = {
hotelName: 'abc',
starRating: '',
contactName: 'xyz',
phoneNumber: '917777777777',
address: 'my address',
city: 'a city',
placeForSearch: 'dnjwjn',
postalCode: '888888',
parking: 'No',
breakfast: 'Yes, Free',
facilities: [ 'Garden', 'Restaurant', 'Terrace' ],
extraBed: 'Yes',
noOfExtraBeds: '2',
freeCancellationAvailable: 'Day of arrival',
ifNotCancelledBeforeDate: 'of the first day',
checkIn: '00 : 00',
checkOut: '00 : 00',
accomodateChildren: 'No',
allowPets: 'No',
provideDormitoryForDriver: 'No',
isPrepaymentRequired: 'No',
GST: 'No',
tradeName: '',
GSTIN: '',
panCardNumber: '',
state: '',
mainPhoto: 'public/abc/1622985481065880430129042agra.jpeg',
photos: [
'public/abc/1622985481065286597229809mumbai.jpg',
'public/abc/1622985481066077551094770munnar.jpg',
'public/abc/1622985481066392466455226mysore.jpg'
]
};
Object.entries(obj).forEach(([k,v]) => {
if (v === 'Yes') {
obj[k] = true
} else if(v == 'No') {
obj[k] = false
}
});
console.log(obj);