0

Hi all I have following data:

const section = {
  fileds: [
    { id: "some Id-1", type: "user-1" },
     {
      child: [
        { id: "some Id-2", type: "user-2" },
        { fileds: [{ id: "kxf5", status: "pending" }] },
        { fileds: [{ id: "ed5t", status: "done" }] }
      ]
    },
    {
      child: [
        { id: "some Id-3", type: "teacher" },
        { fileds: [{ id: "ccfr", status: null }] },
        { fileds: [{ id: "kdpt8", status: "inProgress" }] }
      ]
    }
  ]
};

and following code:


const getLastIds = (arr) =>
  arr.flatMap((obj) => {
    const arrayArrs = Object.values(obj).filter((v) => Array.isArray(v));
    const arrayVals = Object.entries(obj)
      .filter(([k, v]) => typeof v === "string" && k === "id")
      .map(([k, v]) => v);
    return [...arrayVals, ...arrayArrs.flatMap((arr) => getLastIds(arr))];
  });

console.log(getLastIds(section.fileds));

// output is (7) ["some Id-1", "some Id-2", "kxf5", "ed5t", "some Id-3", "ccfr", "kdpt8"]

My code doing following, it printing in new array all ids.

It's working but I don't need all ids.

I need to return only last id in array and I should use recursion. The output should be

(4) [" "kxf5", "ed5t", "ccfr", "kdpt8"]

P.S. here is my code in codesandbox

Is there a way to solve this problem with recursion? Please help to fix this.

7
  • 1
    why not use same named properties for children? this would make recursion easier. Commented Apr 26, 2022 at 14:40
  • Data comes from backend. Commented Apr 26, 2022 at 14:41
  • btw, why not 'some Id-1' as result? Commented Apr 26, 2022 at 14:41
  • @NinaScholz because it seems like homework. There are multiple questions being asked with section fileds and trying to get an array of id's Commented Apr 26, 2022 at 14:42
  • Nice catch @0stone0 Commented Apr 26, 2022 at 14:44

2 Answers 2

1

You can do it with reduce.

function getLastIds (value) {
    return value.reduce((prev, cur) => {
        if (cur.id) {
            return [ ...prev, cur.id ];
        } else {
            let key = ('child' in cur) ? 'child' : 'fileds';
            return [ ...prev, ...getLastIds (cur[key]) ]
        }
    }, []);
}
Sign up to request clarification or add additional context in comments.

Comments

0

You could check if a certain key exists and take this property for mapping id if status exists.

const
    getValues = data => {
        const array = Object.values(data).find(Array.isArray);
        return array
            ? array.flatMap(getValues)
            : 'status' in data ? data.id : [];
    },
    section = { fileds: [{ id: "some Id-1", type: "user-1" }, { child: [{ id: "some Id-2", type: "user-2" }, { fileds: [{ id: "kxf5", status: "pending" }] }, { fileds: [{ id: "ed5t", status: "done" }] }] }, { child: [{ id: "some Id-3", type: "teacher" }, { fileds: [{ id: "ccfr", status: null }] }, { fileds: [{ id: "kdpt8", status: "inProgress" }] }] }] },
    result = getValues(section);

console.log(result);

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.