0

How to separate all fields whose key ends with 0x into a separate object/array using filter.

That is, all 00s, 01s, 02s must be filters out into a separate object or array.

The use the object entries to separate it by index but it fails when field is missing. So the day here is dynamic i.e sometime some fields are not entered. I guess filtering is the only way?

 {
     "hotel00": "asdasd",
      "adult00": "asdasd",
      "child00": "asdasd",
      "infant00": "asdasd",
      "hotel01": "asdasd",
      "adult01": "asdasd",
      "child01": "asdasd",
      "infant01": "asdas",
      "hotel02": "asdasdas",
      "adult02": "asdasd",
      "child02": "asdasd",
      "infant02": "asdasd",
      "hotel10": "asdasd",
      "adult10": "asdasd",
      "child10": "asdsd",
      "infant10": "asd",
      "hotel11": "asdsd",
      "adult11": "asd",
      "child11": "asdsd",
      "infant11": "asd",
      "hotel12": "asdasd",
      "adult12": "asdasd",
      "child12": "asdasdasd",
      "infant12": "asdsdasd",
    }

Output

       {
  "a": [
    {
      "hotel00": "asdasd",
      "adult00": "asdasd",
      "child00": "asdasd",
      "infant00": "asdasd",
    },
    {
      "hotel01": "asdasd",
      "adult01": "asdasd",
      "child01": "asdasd",
      "infant01": "asdas",
    },
    {
      "hotel02": "asdasdas",
      "adult02": "asdasd",
      "child02": "asdasd",
      "infant02": "asdasd",
    }
  ],
    "b": [
      {
        "hotel10": "asdasd",
        "adult10": "asdasd",
        "child10": "asdsd",
        "infant10": "asd",
      },
      {
        "hotel11": "asdsd",
        "adult11": "asd",
        "child11": "asdsd",
        "infant11": "asd",
      },
      {
        "hotel12": "asdasd",
        "adult12": "asdasd",
        "child12": "asdasdasd",
        "infant12": "asdsdasd",
      }
    ]
}
5
  • What entries start with 0? I don't see anything that starts with 0 in your object Commented Mar 6, 2020 at 9:42
  • hotel00, adult00 infant00 it has to be part of the same group... Commented Mar 6, 2020 at 9:43
  • Do you have any 001 for example . So 3 digits or more ? And what have you tried so far ? Commented Mar 6, 2020 at 9:43
  • You can use linqJs for grouping and filtering.It has lots of facilities Commented Mar 6, 2020 at 9:53
  • Sorry for the misunderstanding. I've edited the question Commented Mar 6, 2020 at 9:58

1 Answer 1

2

Hope this does delivers the answer to your question

const obj =  {
  "hotel00": "asdasd",
   "adult00": "asdasd",
   "child00": "asdasd",
   "infant00": "asdasd",
   "hotel01": "asdasd",
   "adult01": "asdasd",
   "child01": "asdasd",
   "infant01": "asdas",
   "hotel02": "asdasdas",
   "adult02": "asdasd",
   "child02": "asdasd",
   "infant02": "asdasd",
   "hotel10": "asdasd",
   "adult10": "asdasd",
   "child10": "asdsd",
   "infant10": "asd",
   "hotel11": "asdsd",
   "adult11": "asd",
   "child11": "asdsd",
   "infant11": "asd",
   "hotel12": "asdasd",
   "adult12": "asdasd",
   "child12": "asdasdasd",
   "infant12": "asdsdasd",
 }
 
const {a,b,c,d,e,f} = Object.keys(obj).reduce(({a,b,c,d,e,f}, val, index) => ({
     a: /00\b(?<=\w)/.test(val)  ? {...a, [val]:obj[val]} : a,
     b: /01\b(?<=\w)/.test(val)  ? {...b, [val]:obj[val]} : b,
     c: /02\b(?<=\w)/.test(val)  ? {...c, [val]:obj[val]} : c,
     d: /10\b(?<=\w)/.test(val)  ? {...d, [val]:obj[val]} : d,
     e: /11\b(?<=\w)/.test(val)  ? {...e, [val]:obj[val]} : e,
     f: /12\b(?<=\w)/.test(val)  ? {...f, [val]:obj[val]} : f,
   }),{a:{},b:{},c:{},d:{},e:{},f:{}})

 const results = {
   a: [a,b,c],
   b: [d,e,f]
 };
 
 console.log(results)

LE second example

const obj =  {
  "hotel00": "asdasd",
   "adult00": "asdasd",
   "child00": "asdasd",
   "infant00": "asdasd",
   "hotel01": "asdasd",
   "adult01": "asdasd",
   "child01": "asdasd",
   "infant01": "asdas",
   "hotel02": "asdasdas",
   "adult02": "asdasd",
   "child02": "asdasd",
   "infant02": "asdasd",
   "hotel10": "asdasd",
   "adult10": "asdasd",
   "child10": "asdsd",
   "infant10": "asd",
   "hotel11": "asdsd",
   "adult11": "asd",
   "child11": "asdsd",
   "infant11": "asd",
   "hotel12": "asdasd",
   "adult12": "asdasd",
   "child12": "asdasdasd",
   "infant12": "asdsdasd",
 }

 const result = Object.keys(obj).reduce((acc,val)=>{
    ['00','01','02','10','11','12'].forEach((item, index) => {
      const x = index<3 ? 'a' : 'b';
      const i = index<3 ? index : index-3;
      acc[x][i] = val.substring(val.length-2) === item ? {...acc[x][i], [val]:obj[val]} : acc[x][i];
    })
    return acc;
 },{a:[],b:[]})

 console.log(result)

Sign up to request clarification or add additional context in comments.

1 Comment

added a second example hope it's simpler

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.