简体   繁体   中英

How to get a list of IDS from first and second level array

I have the following structure in JSON/JavaScript:

{
  "comments": [
    {
      "id": 1,
      "content": "lorem ipsum",
      "answers": []
    },
    {
      "id": 2,
      "content": "lorem ipsum",
      "answers": [
        {
          "id": 30,
          "content": "lorem ipsum"
        }
      ]
    },
    {
      "id": 3,
      "content": "lorem ipsum",
      "answers": [
        {
          "id": 99,
          "content": "lorem ipsum"
        },
        {
          "id": 103,
          "content": "lorem ipsum"
        }
      ]
    },
    {
      "id": 5,
      "content": "comment",
      "answers": []
    }
  ]
}

I need to create an array containing the id of all comments, including answers type comments

The end should look like this

[1, 2, 3, 5, 30, 99, 103]

Can I just use map , reduce and filter ?

What can I try next?

If you can also use flat :

 const data = {comments:[{id:1,content:"lorem ipsum",answers:[]},{id:2,content:"lorem ipsum",answers:[{id:30,content:"lorem ipsum"}]},{id:3,content:"lorem ipsum",answers:[{id:99,content:"lorem ipsum"},{id:103,content:"lorem ipsum"}]},{id:5,content:"comment",answers:[]}]}; function findIds(obj) { return obj.comments.map(com => { return [ com.id, ...com.answers.map(ans => ans.id) ] }).flat().sort((a, b) => a - b); } console.log( findIds(data) ); // [1,2,3,5,30,99,103]

Otherwise, just using map and reduce :

 const data = {comments:[{id:1,content:"lorem ipsum",answers:[]},{id:2,content:"lorem ipsum",answers:[{id:30,content:"lorem ipsum"}]},{id:3,content:"lorem ipsum",answers:[{id:99,content:"lorem ipsum"},{id:103,content:"lorem ipsum"}]},{id:5,content:"comment",answers:[]}]}; function findIds(obj) { return obj.comments.reduce((res, com) => { return [...res, com.id, ...com.answers.map(ans => ans.id) ] }, []).sort((a, b) => a - b); } console.log( findIds(data) ); // [1,2,3,5,30,99,103]

You can achieve your required output using Spread_syntax / concat reduce , map and sort method of array.

Please have a look into below code snippet:

ES6

 var obj = {"comments":[{"id":1,"content":"lorem ipsum","answers":[]},{"id":2,"content":"lorem ipsum","answers":[{"id":30,"content":"lorem ipsum"}]},{"id":3,"content":"lorem ipsum","answers":[{"id":99,"content":"lorem ipsum"},{"id":103,"content":"lorem ipsum"}]},{"id":5,"content":"comment","answers":[]}]}; let result = obj.comments.reduce((r,o)=>[...r, o.id,...o.answers.map(v=>v.id)],[]); console.log(result.sort((a,b)=> ab));

ES5

 var data = {"comments":[{"id":1,"content":"lorem ipsum","answers":[]},{"id":2,"content":"lorem ipsum","answers":[{"id":30,"content":"lorem ipsum"}]},{"id":3,"content":"lorem ipsum","answers":[{"id":99,"content":"lorem ipsum"},{"id":103,"content":"lorem ipsum"}]},{"id":5,"content":"comment","answers":[]}]}; //This function will return the all id's from the passed array as per above object data. function getIDs(obj) { var result = obj.comments.reduce(function(res, item) { var answers = item.answers.map(function(ans) { return ans.id; }); res.push(item.id);//Adding id in array from main list return res.concat(answers);//Using contact method for add both arrays values }, []); return result.sort(function(a, b) { return a - b; }); } console.log(getIDs(data));

try this code

your JSON: data__ = {... }

let result = []
let innerObjs = []
for (let i = 0; i < data__.comments.length; i++){
    let obj = data__.comments[i].id
    result.push(obj)
    innerObjs.push(data__.comments[i].answers)
}
for(let a = 0; a < innerObjs.length; a ++){
    let answers = innerObjs[a]
    for(let j =0; j < answers.length; j++){
        let ans = answers[j]
        if(ans)             
            result.push(ans.id)
    }
}
console.log(result)

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