Reputation: 179
I need a function which checks an array with integers. The integers have to be either in ascending order or in descending order. That depends from case to case.
I have figured out the following solution:
const areVersionNumbersInExpectedOrder = (aNums, sExpectedOrder = "ascending") => {
let passed = false;
if (sExpectedOrder === "ascending") {
if (aNums[0] < aNums[1] && aNums[1] < aNums[2]) {
passed = true;
}
} else if (sExpectedOrder === "descending") {
if (aNums[0] > aNums[1] && aNums[1] > aNums[2]) {
passed = true;
}
}
return passed
};
const versionNumbersAscending = [1, 2, 3];
console.log(
`Result ascending order: ${areVersionNumbersInExpectedOrder(versionNumbersAscending, "ascending")}`);
const versionNumbersDescending = [3, 2, 1];
console.log(
`Result descending order: ${areVersionNumbersInExpectedOrder(versionNumbersDescending, "descending")}`);
Basically it works for me, but it is ugly. Especially the nested ifs.
Is there are better way to solve the task?
Upvotes: 1
Views: 39
Reputation: 311
I think this is better:
const isInOrder = (arr, isAscending = true) => {
let result = false;
for (let i = 0; i < arr.length - 1; i++) {
result = isAscending ? arr[i] <= arr[i + 1] : arr[i] >= arr[i + 1];
if (!result) {
return result;
}
}
return result;
};
Upvotes: 1
Reputation: 12637
how about something like this:
const isSortedAscending = (v, i, a) => i === 0 || v >= a[i - 1];
const isSortedDescending = (v, i, a) => i === 0 || v <= a[i - 1];
const versionNumbersAscending = [1, 2, 3];
console.log(`Result ascending order: %o`, versionNumbersAscending.every(isSortedAscending));
const versionNumbersDescending = [3, 2, 1];
console.log(`Result descending order: %o`, versionNumbersDescending.every(isSortedDescending));
const versionNumbersAscending2 = [1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 8, 9];
console.log(`arbitrary length arrays: %o`, versionNumbersAscending2.every(isSortedAscending));
console.log(`should fail: %o`, [1, 2, 3, 2, 4, 5].every(isSortedAscending));
Upvotes: 1
Reputation: 386604
You could take a shorter approach with every
and a callback depending on the expected order.
const areVersionNumbersInExpectedOrder = (aNums, sExpectedOrder = "ascending") => {
const
order = {
ascending: (b, i, { [i - 1]: a }) => !i || a < b,
descending: (b, i, { [i - 1]: a }) => !i || a > b
};
return aNums.every(order[sExpectedOrder]);
};
console.log(areVersionNumbersInExpectedOrder([1, 2, 3], "ascending"));
console.log(areVersionNumbersInExpectedOrder([3, 2, 1], "descending"));
Upvotes: 1