I have the following:
const array = [{value: 'banana'}, {value: 'apple'}, {value: 'yellow'}, {value: 'red'}]
I need the following:
const result = [{banana: 'yellow'}, {apple: 'red'}];
Is there a way to create result from the array, using loops or higher-order-functions in JavaScript?
You can use Array.prototype.flatMap:
const flatMapToEntry = (key, index, array) => {
const length = array.length / 2;
if (index >= length) {
return [];
}
const value = array[index + length];
return [{ [key]: value }];
};
const result = array.map(o => o.value).flatMap(flapMapToEntry);
Here is an answer using the same logic provided in the comment. This has relevant descriptions to help understand better.
const getMyObject = arr => {
// first compuate the half-length "lenBy2" of given array
const lenBy2 = Math.floor(arr.length / 2);
// return the "result" as an object
return Object
.fromEntries( // generate object from key-value pairs below
arr.map( // iterate "arr" to obtain key-value pairs
({ value }, idx) => ( // get the index "idx" and de-structure to access "value"
idx < lenBy2 // if index less than half-length "lenBy2"
? [ // return key-value pair as a 2-element array
value, // [ "banana", "yellow" ], for example
arr[idx + lenBy2]?.value
]
: [] // if index >= half-length, return empty array
)
).filter( // filter key-value pairs to retain only non-empty ones
x => x.length == 2
)
);
};
// below are steps only to generate results for various test cases
// the original array from the question
const array1 = [{value: 'banana'}, {value: 'apple'}, {value: 'yellow'}, {value: 'red'}];
// test-case 2 - an array with 3 pairs
const array2 = [
{value: 'banana'}, {value: 'apple'}, {value: 'tomato'},
{value: 'yellow'}, {value: 'green'}, {value: 'red'}
];
// mismatched array where the fruit "orange" has no matching color
const array3 = [
{value: 'banana'}, {value: 'apple'}, {value: 'orange'},
{value: 'yellow'}, {value: 'red'}
];
// mismatched array where the color "orange" has no matching fruit
const array4 = [
{value: 'banana'}, {value: 'apple'},
{value: 'yellow'}, {value: 'red'}, {value: 'orange'}
];
// iterate over the various test case arrays &
// console.log the result
[array1, array2, array3, array4].forEach((arr, idx) =>
console.log(
`\n***---> test case ${idx + 1} <---***\n`,
'given array: 👉 ', JSON.stringify(arr),
'\n\nresult object: 👇 \n', getMyObject(arr),
'\n ***---> end of result <---*** \n\n'
)
);
.as-console-wrapper { max-height: 100% !important; top: 0 }
Feel free to post questions in comments, in case it is unclear how the above works.