Merge elements (v3)

Revision 3 of this benchmark created on


Setup

const generateState = (size) => {
	return new Array(size).fill().map((e, i) => ({ id: i, text: `text ${i}` }));
}

const state = generateState(50);
const stateToMerge = generateState(70);

const getNewStateForEach = (state, messages) => {
    const messagesToMerge = [];

    messages.forEach((message) => {
        const alreadyInState = state.find((messageInState) => messageInState.id === message.id);

        if (!alreadyInState) {
            messagesToMerge.push(message);
        }
    });

    return [...messagesToMerge, ...state];
}

const getNewStateReduce = (state, messages) => {
    const messagesToMerge = messages.reduce((acc, message) => {
        const alreadyInState = acc.find((messageInState) => messageInState.id === message.id);

        if (!alreadyInState) {
            acc.push(message);
        }

        return acc
    }, state);

    return [...messagesToMerge, ...state];
}

const getNewStateSet = (state, messages) => {
  const idsInState = new Set(state.map((message) => message.id));
  const messagesNotInState = messages.filter((message) => !idsInState.has(message.id));
  return [...messagesNotInState, ...state];
}

Test runner

Ready to run.

Testing in
TestOps/sec
Using forEach
const newState = getNewStateForEach(state, stateToMerge);
ready
Using reduce
const newState = getNewStateReduce(state, stateToMerge);
ready
Using Set
const newState = getNewStateSet(state, stateToMerge);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.