Существует ли какой-либо чистый и лучший способ замены значения объекта на основе условия в javascript

#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);