简体   繁体   中英

Lodash Filter Array and Get Parent Index

My Api returns this in json format

[
   {
      "title":"Category One",
      "data":[
         {
            "id":"5",
            "code":"0001",
            "name":"Item Name"
         },
         {
            "id":"6",
            "code":"0002",
            "name":"Item Name 2"
         }
      ]
   },
   {
      "title":"Category Two",
      "data":[
         {
            "id":"7",
            "code":"0003",
            "name":"Item Name 3"
         },
         {
            "id":"8",
            "code":"0004",
            "name":"Item Name 4"
         }
      ]
   }
]

I want to filter above given array by id I tried it like:

_.filter(data, ["title.data.id", "5"]);

But returns empty array, then i also tried it like:

_.filter(data, { data: [{ id: "5" }] });

But returns the full array.

Kindly guide what am i missing here.

You need to take the wanted properties and iterate the inner array as well.

 var data = [{ title: "Category One", data: [{ id: "5", code: "0001", name: "Item Name" }, { id: "6", code: "0002", name: "Item Name 2" }] }, { title: "Category Two", data: [{ id: "7", code: "0003", name: "Item Name 3" }, { id: "8", code: "0004", name: "Item Name 4" }] }], result = _.filter(data, ({ data }) => _.some(data, ({ id }) => id === "5")); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

 let obj = [ { "title": "Category One", "data": [ { "id": "5", "code": "0001", "name": "Item Name" }, { "id": "6", "code": "0002", "name": "Item Name 2" } ] }, { "title": "Category Two", "data": [ { "id": "7", "code": "0003", "name": "Item Name 3" }, { "id": "8", "code": "0004", "name": "Item Name 4" } ] } ] function getFilterResult(filterValue) { let result = {} for (let i = 0; i < obj.length; i++) { let data = obj[i]['data'] let index = data.findIndex(da => da.id === filterValue) if (index > -1) { result['title'] = obj[i].title data[index]['name']="New Item" /* added the code for updating the Name filed */ result['data'] = [data[index]] } } return result } let finalResult = getFilterResult("7") console.log(finalResult)

Using lodash

 let data = [ { "title": "Category One", "data": [ { "id": "5", "code": "0001", "name": "Item Name" }, { "id": "6", "code": "0002", "name": "Item Name 2" } ] }, { "title": "Category Two", "data": [ { "id": "7", "code": "0003", "name": "Item Name 3" }, { "id": "8", "code": "0004", "name": "Item Name 4" } ] } ]; var output = _.find(data, item => _.find(item.data, d => d.id === '7')); output['data'][_.findIndex(output['data'], { id: '7' })]['name']= "New Item"; console.log(output)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

Here is solution with just simple JS

 const data = [ { "title":"Category One", "data":[ { "id":"5", "code":"0001", "name":"Item Name" }, { "id":"6", "code":"0002", "name":"Item Name 2" } ] }, { "title":"Category Two", "data":[ { "id":"7", "code":"0003", "name":"Item Name 3" }, { "id":"8", "code":"0004", "name":"Item Name 4" } ] } ]; const requried = data.find(item => item.data.find(d => d.id === '5')); console.log(requried);

Using lodash

 const data = [ { "title":"Category One", "data":[ { "id":"5", "code":"0001", "name":"Item Name" }, { "id":"6", "code":"0002", "name":"Item Name 2" } ] }, { "title":"Category Two", "data":[ { "id":"7", "code":"0003", "name":"Item Name 3" }, { "id":"8", "code":"0004", "name":"Item Name 4" } ] } ]; const required = _.find(data, item => _.find(item.data, d => d.id === '5')); console.log(required);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

You can do this with reduce and filter

 const data = [ { title: 'Category One', data: [ { id: '5', code: '0001', name: 'Item Name', }, { id: '6', code: '0002', name: 'Item Name 2', }, ], }, { title: 'Category Two', data: [ { id: '7', code: '0003', name: 'Item Name 3', }, { id: '8', code: '0004', name: 'Item Name 4', }, ], }, ]; data.reduce((acc, curr) => { const val = curr.data.filter((d) => d.id == '5'); if (val.length) acc = [...acc, ...val]; return acc; }, []);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM