Home > database >  JSON array sort by key value
JSON array sort by key value

Time:09-04

I want to sort a a json array by selected key value.

    var Json = [{
        "post_id": 3,
        "distance": "2.130122"
    }, {
       "post_id": 3,
        "distance": null
    }, {
       "post_id": 4,
        "distance": "4.130122"
    }, {
       "post_id": 5,
        "distance": "3.130122"
    }];

I want to remove the index who have distance:null and want to sort it by distance order. expected json I want like this

 {
        "post_id": 3,
        "distance": "2.130122"
    }, {
       "post_id": 5,
        "distance": "3.130122"
    }, {
       "post_id": 4,
        "distance": "4.130122"
    }
and want to display only post_id as comma seperated **3,5,4**

Here I tried below code.

var Json = [{
        "post_id": 3,
        "distance": "2.130122"
    }, {
       "post_id": 3,
        "distance": null
    }, {
       "post_id": 4,
        "distance": "4.130122"
    }, {
       "post_id": 5,
        "distance": "3.130122"
    }];
Json.sort((a,b)=> (a.distance > b.distance ? 1 : -1))
        var visiblePostId = Json
            .filter(function (item) {
                if (!isNaN(item.distance)) {
                    return item.post_id;
                }
            })
            .map((item) => {
                return item.post_id;
            })
            .join(',');
        console.log(visiblePostId)

<!-- begin snippet: js hide: false console: true babel: false -->

Extra help: If somehow duplicate post_id come after sort How can I remove duplicate post id?

CodePudding user response:

You can do what you want with 4 steps:

  • filter on whether distance is null
  • sort based on distance (note converting to numeric is not strictly necessary as JS will automatically do that when using the - operator on two strings (see the spec))
  • map to the post_id
  • join with ,

var Json = [{
  "post_id": 3,
  "distance": "2.130122"
}, {
  "post_id": 3,
  "distance": null
}, {
  "post_id": 4,
  "distance": "4.130122"
}, {
  "post_id": 5,
  "distance": "3.130122"
}];

const VisiblePostIds = Json
  .filter(({ distance }) => distance !== null)
  .sort((a, b) => a.distance - b.distance)
  .map(({ post_id }) => post_id)
  .join(',')

console.log(VisiblePostIds)

Note that if you might have distance strings which are empty that you also want to filter out, you can change the filter to:

.filter(({ distance }) => distance)
  • Related