0

I am having a selected object that has the following structure

const selected = [
  { field: { prop1: "value1" }, isDeleted: true, isSelected: false },
  { field: { prop1: "value2" }, isDeleted: true, isSelected: false },
  { field: { prop1: "value3" }, isDeleted: false, isSelected: false }
];

Also I am having current objects with the following structure

const current = [
  { field: { prop1: "value2" }, isDeleted: false, isSelected: false },
  { field: { prop1: "value1" }, isDeleted: false, isSelected: false }
];

Now basically I have return appended list with remaining objects that has isDeleted: true in current, and then take the objects of selected that has isDeleted: true and append to the current, with isDeleted: false i sequence of its presence in selected

For the above input the output will be,

const output = [
  { field: { prop1: "value3" }, isDeleted: false, isSelected: false },
  { field: { prop1: "value2" }, isDeleted: false, isSelected: false },
  { field: { prop1: "value1" }, isDeleted: false, isSelected: false }
];

As the object in current with field prop1 has isDeleted :false, so that becomes the first object. And remaining objects of current are matched with selected to find a match using name and isDeleted: true and adding it to the output, with its isDeleted changing to false.

Code that I tried

const selected = [
  { field1: { prop1: "value1" }, isDeleted: true, isSelected: false },
  { field1: { prop1: "value2" }, isDeleted: true, isSelected: false },
  { field1: { prop1: "value3" }, isDeleted: false, isSelected: false }
];

const current = [
  { field1: { prop1: "value1" }, isDeleted: false, isSelected: false },
  { field1: { prop1: "value2" }, isDeleted: false, isSelected: false }
];
const selectedModified = selected.map((sel) => {
  const found = current.find(
    (cur) => cur.field.prop1 === sel.field.prop1 && sel.isDeleted
  );
  if (found) {
    return {
      field: sel.field,
      isDeleted: false,
      isSelected: false
    };
  }
  return sel;
});
const filtered = [...(selectedModified || []), ...current].filter(
  filterBy("prop1")
);
const filterBy = (key, set = new Set()) => (o) =>
!set.has(o.file[key]) && set.add(o.file[key]);
console.log(filtered);


1 Answer 1

0

Wouldn't that just be: concatenating the two arrays and filtering the result for isDeleted === false?

const selected = [
  { field: { prop1: "value1" }, isDeleted: true, isSelected: false },
  { field: { prop1: "value2" }, isDeleted: true, isSelected: false },
  { field: { prop1: "value3" }, isDeleted: false, isSelected: false }
];
const current = [
  { field: { prop1: "value2" }, isDeleted: false, isSelected: false },
  { field: { prop1: "value1" }, isDeleted: false, isSelected: false }
];

const output = selected.concat(current).filter(v => !v.isDeleted);
document.querySelector(`pre`).textContent = JSON.stringify(output, null, 2);
<pre></pre>

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

Comments

Your Answer

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