0

I need to get a property added based on the one of the array property. Since already I am looping through the array is there a simple way to achieve below output from the input, Also I don't want to make the input array mutated

Input array

const a = [{is_done: true, name: 'a'}, {is_done: true, name: 'b'}, {is_done: true, name: 'c'}]

Output array

[
    {
        "is_done": true,
        "name": "a",
        "which_is_last_done": false
    },
    {
        "is_done": true,
        "name": "b",
        "which_is_last_done": false
    },
    {
        "is_done": true,
        "name": "c",
        "which_is_last_done": true
    }
]

I am able to achieve this output using the below snippet, is there a better way.

const a = [{
  is_done: true,
  name: 'a'
}, {
  is_done: true,
  name: 'b'
}, {
  is_done: true,
  name: 'c'
}];

const output = a.reduce(
  (acc, item, i, array) => {
    acc.items.push({
      ...item,
      which_is_last_done: [...array].reverse().find(item => item.is_done)?.name === item.name,

    });
    return acc;
  }, {
    items: []
  }
);

console.log(output.items)

1
  • Make a deep copy of the array. Add which_is_done_last: false to all the elements. Then find the last element that's done and change it to true. Commented Jan 21, 2022 at 16:30

2 Answers 2

1

You can first look for the index of the "last done" element. Afterwards copy all objects and for the element with this index set which_is_last_done to true.

const a = [{
  is_done: true,
  name: 'a'
}, {
  is_done: true,
  name: 'b'
}, {
  is_done: true,
  name: 'c'
}];

const lastDoneIndex = a.map(item => item.is_done).lastIndexOf(true)
const output = a.map((item, index) => {
  return {
    ...item,
    which_is_last_done: index === lastDoneIndex,
  }
})

console.log(output)

Sign up to request clarification or add additional context in comments.

Comments

1

const a = [{
  is_done: true,
  name: 'a'
}, {
  is_done: true,
  name: 'b'
}, {
  is_done: true,
  name: 'c'
}];

// make deep copy of input
const output = a.map(el => ({...el, which_is_done_last: false}));
// find last element that's done
const last_done = [...output].reverse().find(({is_done}) => is_done);
if (last_done) {
  // update boolean property
  last_done.which_is_done_last = true;
}

console.log(output)

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.