【问题标题】:Is there any clean and better way of replacing object value based on condition in javascript是否有任何干净和更好的方法来根据javascript中的条件替换对象值
【发布时间】:2021-08-23 20:05:28
【问题描述】:

有没有更好的方法来使用纯 javascript 或使用 lodash 包来做到这一点。感觉这段代码有点丑,违反了DRY原则。

{
  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

【问题讨论】:

  • 提示 - 任何时候你检查一个条件然后返回 truefalse,你可以用条件替换,因为 that 也返回 true 或 @ 987654326@。最多,你必须否定它。 x === "No"?false:truex !== "No" 相同。
  • 你忘了parking
  • no @MisterJojo 我故意离开了,因为停车接受 3 个值之一(“No”、“Yes, Free”、“Yes, Paid”)

标签: javascript node.js json object


【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 2012-08-01
        • 2021-09-19
        • 2023-04-07
        • 2011-11-05
        • 1970-01-01
        • 2021-06-21
        相关资源
        最近更新 更多