【问题标题】:Iterating through array of objects react-native遍历对象数组 react-native
【发布时间】:2021-01-30 16:02:07
【问题描述】:

我有这样的回应

   {
   "payload":{
      "count":158,
      "transactionList":[
         {
            "_id":2410787,
            "chnl":"Mobile",
            "crtd_by":30001,
            "crtd_dt":{
               "$date":"2020-10-12T11:26:52.243Z"
            },
            "event_id":"1005",
            "event_name":"1005",
            "interface":{
               "deviceInfo":{
                  "webOrMobile":"web"
               },
               "system":"EI-Platform",
               "event":1005,
               "src_system_name":"SNOC",
               "undefined":"9842012345"
            },
            "locale":"en",
            "nodeid":20,
            "org_id":20,
            "org_type":5,
            "pwd":"KpR8Vp8SMRWPncdaBwMLwnsWh2E1JfoPnTE1rozmc3s=",
            "rqst":"Request-Type",
            "src":"i",
            "status":152,
            "status_track":[
               {
                  "status":103,
                  "updtd_dt":{
                     "$date":"2020-10-12T11:26:52.243Z"
                  }
               },
               {
                  "status":152,
                  "updtd_dt":{
                     "$date":"2020-10-12T11:26:52.452Z"
                  }
               }
            ],
            "timezoneOffset":-330,
            "transaction_id":2410787,
            "tz":"20201012165651",
            "uid":30001,
            "uname":"EIADMIN",
            "updtd_by":30001,
            "updtd_dt":{
               "$date":"2020-10-12T11:26:52.452Z"
            },
            "utype":730,
            "status_name":"Completed",
            "status_key":"status_2",
            "event_description":"Bolt On/Top Up"
         },
         {
            "_id":2410786,
            "chnl":"Web",
            "crtd_by":30001,
            "crtd_dt":{
               "$date":"2020-10-10T12:02:32.069Z"
            },
            "event_id":"1004",
            "event_name":"1004",
            "interface":{
               "amount":120,
               "customerName":"David Smith",
               "event":1004,
               "totalAmount":120,
               "deviceInfo":{
                  "webOrMobile":"web"
               },
               "payment_details":{
                  "cash_mode":{
                     "status":111,
                     "cash":"120"
                  }
               },
               "account_no":11241212
            },
            "locale":"en",
            "nodeid":20,
            "org_id":20,
            "org_type":5,
            "payment_status":111,
            "pwd":"KpR8Vp8SMRWPncdaBwMLwnsWh2E1JfoPnTE1rozmc3s=",
            "rqst":"Create",
            "src":"i",
            "status":152,
            "status_track":[
               {
                  "status":103,
                  "updtd_dt":{
                     "$date":"2020-10-10T12:02:32.069Z"
                  }
               },
               {
                  "status":152,
                  "updtd_dt":{
                     "$date":"2020-10-10T12:02:32.319Z"
                  }
               }
            ],
            "timezoneOffset":-330,
            "transaction_id":2410786,
            "tz":"20201010120230",
            "uid":30001,
            "uname":"EIADMIN",
            "updtd_by":30001,
            "updtd_dt":{
               "$date":"2020-10-10T12:02:32.319Z"
            },
            "utype":1,
            "status_name":"Completed",
            "status_key":"status_2",
            "event_description":"Bill Payment"
         },
         {
            "_id":2410762,
            "chnl":"Web",
            "crtd_by":30001,
            "crtd_dt":{
               "$date":"2020-09-22T11:15:40.631Z"
            },
            "event_id":"1001",
            "event_name":"1001",
            "interface":{
               "pcardno":"8944110000000100017",
               "doc_tran_value":"",
               "p_lname":"Sharma",
               "product_id":"PAYG01",
               "p_fname":"Rakesh",
               "msisdn":"7999990099",
               "zipcode":"9090",
               "state":"50054",
               "lastname":"Sharma",
               "firstname":"Rakesh",
               "deviceInfo":{
                  "webOrMobile":"web"
               },
               "country":"50052",
               "system":"EI-Platform",
               "title":"50092",
               "icc":"80990",
               "phoneNumber":"9709607195",
               "address":"kormangla",
               "email":"no@no.com",
               "event":1001,
               "dob":"02-Sep-2002"
            },
            "locale":"en",
            "nodeid":20,
            "org_id":20,
            "org_type":5,
            "pending_at":"Head Of Sales",
            "pwd":"KpR8Vp8SMRWPncdaBwMLwnsWh2E1JfoPnTE1rozmc3s=",
            "rqst":"Create",
            "src":"i",
            "status":103,
            "status_track":[],
            "timezoneOffset":-330,
            "transaction_id":2410762,
            "tz":"20200922111540",
            "uid":30001,
            "uname":"EIADMIN",
            "updtd_by":30001,
            "updtd_dt":{
               "$date":"2020-09-22T11:15:40.875Z"
            },
            "utype":1,
            "status_name":"In Progress",
            "status_key":"status_1",
            "event_description":"Prepaid Form"
         }
      ]
   }
}

我需要一个包含event_descriptioncount 的数组,即event_description 来自transactionsListcount 是基于事务列表中event_description 的出现次数。请检查我尝试过的以下代码,但没有成功。你能帮帮我吗?

      var transactionList = response.payload.transactionList
      var events = []
      for (const transaction in transactionList) {
        let existedIndex = events.findIndex(({event}) => event['event_description'] == transaction['event_description'])
        if (existedIndex && existedIndex >= 0) {
          events[existedIndex]['count'] = events[existedIndex]['count'] + 1
        } else {
          let newEvent = { 'event_description': transaction['event_description'], 'count': 1 }
          events.push(newEvent);
        }
      }

结果数组应该包含对象,每个对象都有两个键,一个是count,它是event-description 的出现次数,另一个是event_description 本身。

【问题讨论】:

  • let existedIndex = events.findIndex(({event}) => event['event_description'] == transaction['event_description'])更新为let existedIndex = events.findIndex((event) => event['event_description'] == transaction['event_description'])
  • @SaachiTech,请您充分尝试并帮助我,因为我是 react-native 的新手。我按照您的提示进行了尝试,但没有得到预期的结果。

标签: react-native dictionary for-loop iteration


【解决方案1】:

试试下面的代码块

var transactionList = response.payload.transactionList
var events = []
transactionList.forEach((transaction, index)=>{
  let existedIndex = events.findIndex((event) => event.event_description === transaction.event_description)
  if (existedIndex >= 0) {
    events[existedIndex].count = events[existedIndex].count + 1
  } else {
    let newEvent = { 'event_description': transaction.event_description, 'count': 1 }
    events.push(newEvent);
  }
})
console.log(events)

【讨论】:

    【解决方案2】:

    当您需要使用对象时,您正在使用索引。 您需要使用for of 而不是for in 这是更新后的代码:

      var transactionList = response.payload.transactionList;
      var events = [];
      for (const transaction of transactionList) {
        let existedIndex = events.findIndex(
          ({ event }) =>
            event && // a little test because sometime it returns undifined
            event["event_description"] &&
            event["event_description"] == transaction["event_description"]
        );
        if (existedIndex && existedIndex >= 0) {
          events[existedIndex]["count"] = events[existedIndex]["count"] + 1;
        } else {
          let newEvent = {
            event_description: transaction["event_description"],
            count: 1,
          };
          events.push(newEvent);
        }
      }
    

    这是一个完整的 sn-p,我将 JSON 更改为一个对象,因此您可以在不使用 RN 的情况下对其进行测试。

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>Static Template</title>
      </head>
      <body>
        <script>
          const response = {
            payload: {
              count: 158,
              transactionList: [
                {
                  _id: 2410787,
                  chnl: "Mobile",
                  crtd_by: 30001,
                  crtd_dt: {
                    $date: "2020-10-12T11:26:52.243Z",
                  },
                  event_id: "1005",
                  event_name: "1005",
                  interface: {
                    deviceInfo: {
                      webOrMobile: "web",
                    },
                    system: "EI-Platform",
                    event: 1005,
                    src_system_name: "SNOC",
                    undefined: "9842012345",
                  },
                  locale: "en",
                  nodeid: 20,
                  org_id: 20,
                  org_type: 5,
                  pwd: "KpR8Vp8SMRWPncdaBwMLwnsWh2E1JfoPnTE1rozmc3s=",
                  rqst: "Request-Type",
                  src: "i",
                  status: 152,
                  status_track: [
                    {
                      status: 103,
                      updtd_dt: {
                        $date: "2020-10-12T11:26:52.243Z",
                      },
                    },
                    {
                      status: 152,
                      updtd_dt: {
                        $date: "2020-10-12T11:26:52.452Z",
                      },
                    },
                  ],
                  timezoneOffset: -330,
                  transaction_id: 2410787,
                  tz: "20201012165651",
                  uid: 30001,
                  uname: "EIADMIN",
                  updtd_by: 30001,
                  updtd_dt: {
                    $date: "2020-10-12T11:26:52.452Z",
                  },
                  utype: 730,
                  status_name: "Completed",
                  status_key: "status_2",
                  event_description: "Bolt On/Top Up",
                },
                {
                  _id: 2410786,
                  chnl: "Web",
                  crtd_by: 30001,
                  crtd_dt: {
                    $date: "2020-10-10T12:02:32.069Z",
                  },
                  event_id: "1004",
                  event_name: "1004",
                  interface: {
                    amount: 120,
                    customerName: "David Smith",
                    event: 1004,
                    totalAmount: 120,
                    deviceInfo: {
                      webOrMobile: "web",
                    },
                    payment_details: {
                      cash_mode: {
                        status: 111,
                        cash: "120",
                      },
                    },
                    account_no: 11241212,
                  },
                  locale: "en",
                  nodeid: 20,
                  org_id: 20,
                  org_type: 5,
                  payment_status: 111,
                  pwd: "KpR8Vp8SMRWPncdaBwMLwnsWh2E1JfoPnTE1rozmc3s=",
                  rqst: "Create",
                  src: "i",
                  status: 152,
                  status_track: [
                    {
                      status: 103,
                      updtd_dt: {
                        $date: "2020-10-10T12:02:32.069Z",
                      },
                    },
                    {
                      status: 152,
                      updtd_dt: {
                        $date: "2020-10-10T12:02:32.319Z",
                      },
                    },
                  ],
                  timezoneOffset: -330,
                  transaction_id: 2410786,
                  tz: "20201010120230",
                  uid: 30001,
                  uname: "EIADMIN",
                  updtd_by: 30001,
                  updtd_dt: {
                    $date: "2020-10-10T12:02:32.319Z",
                  },
                  utype: 1,
                  status_name: "Completed",
                  status_key: "status_2",
                  event_description: "Bill Payment",
                },
                {
                  _id: 2410762,
                  chnl: "Web",
                  crtd_by: 30001,
                  crtd_dt: {
                    $date: "2020-09-22T11:15:40.631Z",
                  },
                  event_id: "1001",
                  event_name: "1001",
                  interface: {
                    pcardno: "8944110000000100017",
                    doc_tran_value: "",
                    p_lname: "Sharma",
                    product_id: "PAYG01",
                    p_fname: "Rakesh",
                    msisdn: "7999990099",
                    zipcode: "9090",
                    state: "50054",
                    lastname: "Sharma",
                    firstname: "Rakesh",
                    deviceInfo: {
                      webOrMobile: "web",
                    },
                    country: "50052",
                    system: "EI-Platform",
                    title: "50092",
                    icc: "80990",
                    phoneNumber: "9709607195",
                    address: "kormangla",
                    email: "no@no.com",
                    event: 1001,
                    dob: "02-Sep-2002",
                  },
                  locale: "en",
                  nodeid: 20,
                  org_id: 20,
                  org_type: 5,
                  pending_at: "Head Of Sales",
                  pwd: "KpR8Vp8SMRWPncdaBwMLwnsWh2E1JfoPnTE1rozmc3s=",
                  rqst: "Create",
                  src: "i",
                  status: 103,
                  status_track: [],
                  timezoneOffset: -330,
                  transaction_id: 2410762,
                  tz: "20200922111540",
                  uid: 30001,
                  uname: "EIADMIN",
                  updtd_by: 30001,
                  updtd_dt: {
                    $date: "2020-09-22T11:15:40.875Z",
                  },
                  utype: 1,
                  status_name: "In Progress",
                  status_key: "status_1",
                  event_description: "Prepaid Form",
                },
              ],
            },
          };
    
          var transactionList = response.payload.transactionList;
          var events = [];
          for (const transaction of transactionList) {
            let existedIndex;
            existedIndex = events.findIndex(
              ({ event }) =>
                event &&
                event["event_description"] &&
                event["event_description"] == transaction["event_description"]
            );
            if (existedIndex && existedIndex >= 0) {
              events[existedIndex]["count"] = events[existedIndex]["count"] + 1;
            } else {
              let newEvent = {
                event_description: transaction["event_description"],
                count: 1,
              };
              events.push(newEvent);
            }
          }
          console.log(events);
        </script>
      </body>
    </html>

    【讨论】:

    • if (existedIndex &amp;&amp; existedIndex &gt;= 0) { 如果 existsIndex 为 0,这将不起作用。
    • 因为它在代码中,所以我认为这是他需要的逻辑。也许?!
    【解决方案3】:

    你可以像这样使用数组reduce

    const data= {
       "payload":{
          "count":158,
          "transactionList":[
             {
                "_id":2410787,
                "chnl":"Mobile",
                "crtd_by":30001,
                "crtd_dt":{
                   "$date":"2020-10-12T11:26:52.243Z"
                },
                "event_id":"1005",
                "event_name":"1005",
                "interface":{
                   "deviceInfo":{
                      "webOrMobile":"web"
                   },
                   "system":"EI-Platform",
                   "event":1005,
                   "src_system_name":"SNOC",
                   "undefined":"9842012345"
                },
                "locale":"en",
                "nodeid":20,
                "org_id":20,
                "org_type":5,
                "pwd":"KpR8Vp8SMRWPncdaBwMLwnsWh2E1JfoPnTE1rozmc3s=",
                "rqst":"Request-Type",
                "src":"i",
                "status":152,
                "status_track":[
                   {
                      "status":103,
                      "updtd_dt":{
                         "$date":"2020-10-12T11:26:52.243Z"
                      }
                   },
                   {
                      "status":152,
                      "updtd_dt":{
                         "$date":"2020-10-12T11:26:52.452Z"
                      }
                   }
                ],
                "timezoneOffset":-330,
                "transaction_id":2410787,
                "tz":"20201012165651",
                "uid":30001,
                "uname":"EIADMIN",
                "updtd_by":30001,
                "updtd_dt":{
                   "$date":"2020-10-12T11:26:52.452Z"
                },
                "utype":730,
                "status_name":"Completed",
                "status_key":"status_2",
                "event_description":"Bolt On/Top Up"
             },
             {
                "_id":2410786,
                "chnl":"Web",
                "crtd_by":30001,
                "crtd_dt":{
                   "$date":"2020-10-10T12:02:32.069Z"
                },
                "event_id":"1004",
                "event_name":"1004",
                "interface":{
                   "amount":120,
                   "customerName":"David Smith",
                   "event":1004,
                   "totalAmount":120,
                   "deviceInfo":{
                      "webOrMobile":"web"
                   },
                   "payment_details":{
                      "cash_mode":{
                         "status":111,
                         "cash":"120"
                      }
                   },
                   "account_no":11241212
                },
                "locale":"en",
                "nodeid":20,
                "org_id":20,
                "org_type":5,
                "payment_status":111,
                "pwd":"KpR8Vp8SMRWPncdaBwMLwnsWh2E1JfoPnTE1rozmc3s=",
                "rqst":"Create",
                "src":"i",
                "status":152,
                "status_track":[
                   {
                      "status":103,
                      "updtd_dt":{
                         "$date":"2020-10-10T12:02:32.069Z"
                      }
                   },
                   {
                      "status":152,
                      "updtd_dt":{
                         "$date":"2020-10-10T12:02:32.319Z"
                      }
                   }
                ],
                "timezoneOffset":-330,
                "transaction_id":2410786,
                "tz":"20201010120230",
                "uid":30001,
                "uname":"EIADMIN",
                "updtd_by":30001,
                "updtd_dt":{
                   "$date":"2020-10-10T12:02:32.319Z"
                },
                "utype":1,
                "status_name":"Completed",
                "status_key":"status_2",
                "event_description":"Bill Payment"
             },
             {
                "_id":2410762,
                "chnl":"Web",
                "crtd_by":30001,
                "crtd_dt":{
                   "$date":"2020-09-22T11:15:40.631Z"
                },
                "event_id":"1001",
                "event_name":"1001",
                "interface":{
                   "pcardno":"8944110000000100017",
                   "doc_tran_value":"",
                   "p_lname":"Sharma",
                   "product_id":"PAYG01",
                   "p_fname":"Rakesh",
                   "msisdn":"7999990099",
                   "zipcode":"9090",
                   "state":"50054",
                   "lastname":"Sharma",
                   "firstname":"Rakesh",
                   "deviceInfo":{
                      "webOrMobile":"web"
                   },
                   "country":"50052",
                   "system":"EI-Platform",
                   "title":"50092",
                   "icc":"80990",
                   "phoneNumber":"9709607195",
                   "address":"kormangla",
                   "email":"no@no.com",
                   "event":1001,
                   "dob":"02-Sep-2002"
                },
                "locale":"en",
                "nodeid":20,
                "org_id":20,
                "org_type":5,
                "pending_at":"Head Of Sales",
                "pwd":"KpR8Vp8SMRWPncdaBwMLwnsWh2E1JfoPnTE1rozmc3s=",
                "rqst":"Create",
                "src":"i",
                "status":103,
                "status_track":[],
                "timezoneOffset":-330,
                "transaction_id":2410762,
                "tz":"20200922111540",
                "uid":30001,
                "uname":"EIADMIN",
                "updtd_by":30001,
                "updtd_dt":{
                   "$date":"2020-09-22T11:15:40.875Z"
                },
                "utype":1,
                "status_name":"In Progress",
                "status_key":"status_1",
                "event_description":"Prepaid Form"
             },
             {
                "_id":2410762,
                "chnl":"Web",
                "crtd_by":30001,
                "crtd_dt":{
                   "$date":"2020-09-22T11:15:40.631Z"
                },
                "event_id":"1001",
                "event_name":"1001",
                "interface":{
                   "pcardno":"8944110000000100017",
                   "doc_tran_value":"",
                   "p_lname":"Sharma",
                   "product_id":"PAYG01",
                   "p_fname":"Rakesh",
                   "msisdn":"7999990099",
                   "zipcode":"9090",
                   "state":"50054",
                   "lastname":"Sharma",
                   "firstname":"Rakesh",
                   "deviceInfo":{
                      "webOrMobile":"web"
                   },
                   "country":"50052",
                   "system":"EI-Platform",
                   "title":"50092",
                   "icc":"80990",
                   "phoneNumber":"9709607195",
                   "address":"kormangla",
                   "email":"no@no.com",
                   "event":1001,
                   "dob":"02-Sep-2002"
                },
                "locale":"en",
                "nodeid":20,
                "org_id":20,
                "org_type":5,
                "pending_at":"Head Of Sales",
                "pwd":"KpR8Vp8SMRWPncdaBwMLwnsWh2E1JfoPnTE1rozmc3s=",
                "rqst":"Create",
                "src":"i",
                "status":103,
                "status_track":[],
                "timezoneOffset":-330,
                "transaction_id":2410762,
                "tz":"20200922111540",
                "uid":30001,
                "uname":"EIADMIN",
                "updtd_by":30001,
                "updtd_dt":{
                   "$date":"2020-09-22T11:15:40.875Z"
                },
                "utype":1,
                "status_name":"In Progress",
                "status_key":"status_1",
                "event_description":"Prepaid Form"
             }
          ]
       }
    };
    
    const reducer = (acc, cur) => {
      const item = acc.find((x) => x['event_description'] === cur['event_description']);
      if (item) {
        item.count++;
      } else {
        acc.push({
          event_description: cur.event_description,
          count:1
        });
      }
      return acc;
    };
    
    console.log(data.payload.transactionList.reduce(reducer,[]))

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      相关资源
      最近更新 更多