0

Given array:

var someAnswers = [
  {
    answer:  'Lyndon Johnson', // answer A
    comment: '...'
  },
  {
    answer:  'Richard Nixon', // answer B
    comment: '...'
  },
  {
    answer:  'Jimmy Carter', // answer C
    comment: '...'
  },
  {
    answer:  'Gerald Ford', // answer D
    comment: '...'
  }
];

Some custom order:

customOrder = 'A, C, B, D';

or

customOrder = ['A', 'C', 'B', 'D'];

Do something like this:

someAnswers.sort(customOrder);

Desired result:

[
  {
    "answer": "Lyndon Johnson",
    "comment": "..."
  },
  {
    "answer": "Jimmy Carter",
    "comment": "..."
  },
  {
    "answer": "Richard Nixon",
    "comment": "..."
  },
  {
    "answer": "Gerald Ford",
    "comment": "..."
  }
]

Another custom order:

anotherCustomOrder = 'D, B, A, C';

or

anotherCustomOrder = ['D', 'B', 'A', 'C'];

Do something like this:

someAnswers.sort(anotherCustomOrder);

Desired result:

[
  {
    "answer": "Gerald Ford",
    "comment": "..."
  },
  {
    "answer": "Richard Nixon",
    "comment": "..."
  },
  {
    "answer": "Lyndon Johnson",
    "comment": "..."
  },
  {
    "answer": "Jimmy Carter",
    "comment": "..."
  }
]
5

3 Answers 3

1

If you were willing to replace the letters with numbers in customOrder, you could do something like this:

customOrder = [0, 2, 1, 3];

sort(someAnswers, customOrder) {
    res = [];
    customOrder.forEach((n) => {
        res.push(someAnswers[n]);
    }
    return res;
}

Alternatively, if you really want to use letters:

customOrder = ["A", "C", "B", "D"];

sort(someAnswers, customOrder) {
    res = [];
    customOrder.forEach((n) => {
        res.push(someAnswers[n.charCodeAt(0) - 65]);
    }
    return res;
}
Sign up to request clarification or add additional context in comments.

2 Comments

Could you add a working snippet?
A working snippet would be appreciated. At least there is missing );.
1

You can create an object with the indexes according to the desired order, and then use the function Array.prototype.map and extract the values by using the previously created indexes array.

const someAnswers = [  {    answer:  'Lyndon Johnson', comment: '...'  },  {    answer:  'Richard Nixon',    comment: '...'  },  {    answer:  'Jimmy Carter',     comment: '...'  },  {    answer:  'Gerald Ford',    comment: '...'  }],
      answerIndexes = ['A', 'B', 'C', 'D'].reduce((a, c, i) => ({...a, [c]: i}), {}),
      customOrder = ['A', 'C', 'B', 'D'],
      sorted = customOrder.map(L => someAnswers[answerIndexes[L]]);

console.log(sorted);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1 Comment

Thank you! Could you explain the part where the magic happens (reduce((a, c, i) => ({...a, [c]: i}), {})) and the L in map()?
1

    const sorting = (currentArray, indexArr) => {
        const reArrangedArr = [];
        const deepCopied = JSON.parse(JSON.stringify(currentArray));
        indexArr.forEach(index => reArrangedArr.push(deepCopied[index]));
        return reArrangedArr;
    }
    var someAnswers = [
      {
        answer:  'Lyndon Johnson', // answer A
        comment: '...'
      },
      {
        answer:  'Richard Nixon', // answer B
        comment: '...'
      },
      {
        answer:  'Jimmy Carter', // answer C
        comment: '...'
      },
      {
        answer:  'Gerald Ford', // answer D
        comment: '...'
      }
    ];
    console.log(sorting(someAnswers, [3,0,1,2]))
    

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.