st88
st88

Reputation: 179

Checking the content of an array with comparison operators, concerning a specified order

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

Answers (3)

Mostafa Zaki
Mostafa Zaki

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

Thomas
Thomas

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

Nina Scholz
Nina Scholz

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

Related Questions