Home > Software design >  How to rearrange 3 arrays with according to the elements and return as one array?
How to rearrange 3 arrays with according to the elements and return as one array?

Time:04-08

I have 3 arrays. For example, given the arrays are

arr1 = [2, 7]
arr2 = [0, 1, 16]
arr3 = [3, 6, 9]

And I would like to rearrange them according to the numbers and output as an array.

result = ['arr2', 'arr2', 'arr1', 'arr3', 'arr3', 'arr1', 'arr1', 'arr3', 'arr2']

I think it might have something to do with looping, but I've no luck after struggling for a while. Is there any way to get the expected result?

CodePudding user response:

Option 1. Allocate an array whose size is equal to the total count of elements in the 3 arrays. Populate the newly created array with the elements from your 3 small arrays. Then sort the created array.

Option 2. Merge 2 of the 3 arrays to produce a sorted array with elements from the chosen 2 small arrays. Then merged the sorted array from the previous step with the 3rd array to get the array that you need.

CodePudding user response:

Not an elegant solution but maybe something like can help

arr1 = [2, 7]
arr2 = [0, 1, 16]
arr3 = [3, 6, 9]

let concatedArray = [...arr1, ...arr2, ...arr3].sort((a, b) => a - b);

let finalArr = []

concatedArray.forEach(val => {
            let doesNumberExist = false;
            let arrName = ''
            doesNumberExist = arr1.includes(val);
            arrName = 'arr1';
            if (!doesNumberExist) {
                doesNumberExist = arr2.includes(val);
                arrName = 'arr2'
            }
            if (!doesNumberExist) {
                doesNumberExist = arr3.includes(val);
                arrName = 'arr3'
            }
            finalArr.push(arrName);
        }

 
 )
 console.log(finalArr)

CodePudding user response:

You could move the values to an object and take another object for the indices and sort an array of key.

Then take the key at index zero and go on until the index is equal to the length of the array, then stop the iteration.

const
    arr1 = [2, 7],
    arr2 = [0, 1, 16],
    arr3 = [3, 6, 9],
    values = { arr1, arr2, arr3 },
    result = [],
    keys = Object.keys(values),
    indices = Object.fromEntries(keys.map(k => [k, 0]));

while (true) {
    keys.sort((a, b) => (values[a][indices[a]] ?? Number.MAX_VALUE) - (values[b][indices[b]] ?? Number.MAX_VALUE));
    if (indices[keys[0]] === values[keys[0]].length) break;
    result.push(keys[0]);
    indices[keys[0]]  ;
}

console.log(...result);

  • Related