Home > Software design >  How to deconstruct an array and put it into the "main" array?
How to deconstruct an array and put it into the "main" array?

Time:03-30

How can I deconstruct an array, and put it into the array which it is getting mapped on, and then continue sorting on that?

The array looks like the following after filtering it:

[
    ['traitName', 'value'],
    ['traitName', ['value01', 'value02', 'value03' ...] ],
    //...
]

I want to check every trait, and check if the first index is an array, then deconstruct that, and put it into this array like this:

[
    ['traitName', 'value'],
    ['traitName', value01],
    ['traitName', value02],
    ['traitName', value03],
    //...
],

Then I can continue sorting on this array.

Object.entries(nft)
    .filter((val: any) => val[0] !== 'Attributes' && data.attributes[val[0]] !== undefined)
    .sort((a: any, b: any) => {
      if (typeof a[1] === 'number') return Infinity;
      return (
        data.attributes[a[0]]?.values[a[1]]?.distribution - data.attributes[b[0]]?.values[b[1]]?.distribution
      );
    })

I need to this between the filter and sorting I think.

CodePudding user response:

You can use flatMap to do this:

const data = [
  ['traitName', 'value'],
  ['traitName', ['value01', 'value02', 'value03']],
]

const output = data.flatMap(
  ([n, v]) => (Array.isArray(v) ? v : [v]).map(vv => [n, vv])
);

console.log(output)

CodePudding user response:

you can use this,

const a = [
    ['traitName', 'value'],
    ['traitName', ['value01', 'value02', 'value03'] ]
    
]

let final = []
a.forEach((item)=>{
    console.log(typeof item[1])
    if(typeof item[1] == "string") {
        final.push(item)
    } else if(typeof item[1] == 'object') {
        let len = item[1].length
        item[1].forEach((item2) =>{
            let e = [item[0], item2]
            final.push(e)
        })
    }
})
console.log(final)

CodePudding user response:

This may be achieved by using .map, .concat and .flat(), in one line as shown below:

arr.map(([x, y]) => ([].concat(y).map(z => ([x, z])))).flat()

One possible solution is shown below:

Code Snippet

const arr = [
    ['traitName', 'value'],
    ['traitName', ['value01', 'value02', 'value03'] ]
];

const res = arr.map(
  ar => (
      [].concat(ar[1])
      .map(x => ([ar[0], x]))
    )
)
.flat();

console.log('result using .map & .flat: ', res);

// or in just one line:
console.log(
  'one line result: ',
  arr.map(([x, y]) => ([].concat(y).map(z => ([x, z])))).flat()
);

Explanation

  • Iterate over the original array
  • Use [].concat() to treat the second element of each inner-array as an array
  • Use .map() to iterate over the inner-array element/s
  • Return the desired result
  • Use .flat() to flatten the resulting array.
  • Related