1

I have a nested object array with n level like this:

const data = {
    "id": null,
    "label": "Locations",
    "value": "Locations",
    "expanded": true,
    "children": [
        {
            "id": "A978919C-E99C-EB11-8F2E-A01D48E35246",
            "value": "Tokyo ",
            "label": "Tokyo ",
            "checked": true,
            "children": [
                {
                    "id": "88887069-179A-EB11-9C25-00163EDCFF95",
                    "isDefault": true,
                    "locationId": "A978919C-E99C-EB11-8F2E-A01D48E35246",
                    "parentsId": null,
                    "createDate": "2021-06-20T19:03:55.190Z",
                    "updateDate": "2021-10-16T13:36:41.353Z",
                    "label": "RAJ - Automotive Japan Fa Fusoh",
                    "checked": true,
                    "children": [],
                    "disabled": false
                }
            ]
        },
       
.
.

    ]
}

I have an object

{
    "id": "A978919C-E99C-EB11-8F2E-A01D48E35246",
    "value": "Tokyo ",
    "label": "Tokyo ",
    "checked": false,
    "_depth": 1,
    "_id": "A978919C-E99C-EB11-8F2E-A01D48E35246",
    "_parent": "rdts1-0",
    "_children": [
        "88887069-179A-EB11-9C25-00163EDCFF95"
    ],
    "_focused": true
}

and I want to edit checked in the object array by using the IDs in the last object and its children, change each checked in object in the object array to false I used DFS for the children but I didn't get a good result any help please.

2 Answers 2

1

Seems like recursion would suffice:

const data = {
    id: null,
    label: 'Locations',
    value: 'Locations',
    expanded: true,
    children: [
        {
            id: 'A978919C-E99C-EB11-8F2E-A01D48E35246',
            value: 'Tokyo ',
            label: 'Tokyo ',
            checked: true,
            children: [
                {
                    id: '88887069-179A-EB11-9C25-00163EDCFF95',
                    isDefault: true,
                    locationId: 'A978919C-E99C-EB11-8F2E-A01D48E35246',
                    parentsId: null,
                    createDate: '2021-06-20T19:03:55.190Z',
                    updateDate: '2021-10-16T13:36:41.353Z',
                    label: 'RAJ - Automotive Japan Fa Fusoh',
                    checked: true,
                    children: [],
                    disabled: false,
                },
            ],
        },
    ],
}


function setCheckedToFalse(childrenArr) {
    // error handling
    if (!Array.isArray(childrenArr)) {
        return;
    }

    childrenArr.forEach((child) => {
        // set to false 
        child.checked = false

        // recursion for other children
        setCheckedToFalse(child.children)
    })
}

setCheckedToFalse(data.children)

console.log(data);

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

2 Comments

Thank you very much this was very helpful I used it with dfs code
You're welcome. Consider upvoting the answer as well @DaniaMawlawi
0

Not sure if I correctly understood the question, but the code below the checked value in the data object is set to false in case it exists in object.

const data = {
  id: null,
  label: 'Locations',
  value: 'Locations',
  expanded: true,
  children: [
    {
      id: 'A978919C-E99C-EB11-8F2E-A01D48E35246',
      value: 'Tokyo ',
      label: 'Tokyo ',
      checked: true,
      children: [
        {
          id: '88887069-179A-EB11-9C25-00163EDCFF95',
          isDefault: true,
          locationId: 'A978919C-E99C-EB11-8F2E-A01D48E35246',
          parentsId: null,
          createDate: '2021-06-20T19:03:55.190Z',
          updateDate: '2021-10-16T13:36:41.353Z',
          label: 'RAJ - Automotive Japan Fa Fusoh',
          checked: true,
          children: [],
          disabled: false,
        },
      ],
    },
  ],
};

const object = {
  id: 'A978919C-E99C-EB11-8F2E-A01D48E35246',
  value: 'Tokyo ',
  label: 'Tokyo ',
  checked: false,
  _depth: 1,
  _id: 'A978919C-E99C-EB11-8F2E-A01D48E35246',
  _parent: 'rdts1-0',
  _children: ['88887069-179A-EB11-9C25-00163EDCFF95'],
  _focused: true,
};

// Gets all ids (nested ones included) from object
function getIdsHashMap(obj) {
  const idsHashMap = {};

  const loopThroughChildren = (children = []) => {
    children.forEach((el) => {
      idsHashMap[el] = true;

      if (el._children) {
        loopThroughChildren(el._children);
      }
    });
  };

  if (obj.id) {
    idsHashMap[obj.id] = true;
  }

  loopThroughChildren(obj._children);

  return idsHashMap;
}

// Sets checked in data to false if an id exists in object
function setCheckedValue(obj) {
  const idsHash = getIdsHashMap(object);

  const loopThgroughChildren = (children) => {
    if (!Array.isArray(children)) {
      return;
    }

    children.forEach((child) => {
      // Checks, if id exists in hashmap from object
      if (idsHash[child.id]) {
        child.checked = false;
      }

      if (child.children) {
        loopThgroughChildren(child.children);
      }
    });
  };

  if (obj.children) {
    loopThgroughChildren(obj.children);
  }

  return obj;
}

console.log(setCheckedValue(data));

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.