-1

I have the array below and each element has another array called FunctionalityChildren, I need find the unique object that contains the property ActionFull equal a variable, for example '/budget/allocation' or '/budget'

let bigArray = [
      {
        "FunctionalityID": 114,
        "Name": "General Register",
        "Action": "/general-register",
        "Icon": "settings_input_composite",
        "System_ID": 21,
        "FunctionalityFather_ID": null,
        "Active": 1,
        "Priority": 1,
        "FunctionalityChildren": [
          {
            "FunctionalityID": 115,
            "Name": "Supplier",
            "Action": "/supplier",
            "Icon": "perm_contact_calendar",
            "System_ID": 21,
            "FunctionalityFather_ID": 114,
            "Active": 1,
            "Priority": 1,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1251,
                "Profile_ID": 68,
                "Functionality_ID": 115,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/general-register/supplier"
          },
          {
            "FunctionalityID": 116,
            "Name": "RPA",
            "Action": "/rpa",
            "Icon": "view_day",
            "System_ID": 21,
            "FunctionalityFather_ID": 114,
            "Active": 1,
            "Priority": 2,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1252,
                "Profile_ID": 68,
                "Functionality_ID": 116,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/general-register/rpa"
          },
          {
            "FunctionalityID": 117,
            "Name": "Cost Center",
            "Action": "/cost-center",
            "Icon": "home",
            "System_ID": 21,
            "FunctionalityFather_ID": 114,
            "Active": 1,
            "Priority": 3,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1253,
                "Profile_ID": 68,
                "Functionality_ID": 117,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/general-register/cost-center"
          },
          {
            "FunctionalityID": 118,
            "Name": "Departament",
            "Action": "/departament",
            "Icon": "donut_small",
            "System_ID": 21,
            "FunctionalityFather_ID": 114,
            "Active": 1,
            "Priority": 4,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1254,
                "Profile_ID": 68,
                "Functionality_ID": 118,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/general-register/departament"
          },
          {
            "FunctionalityID": 119,
            "Name": "Product Line",
            "Action": "/product-line",
            "Icon": "view_headline",
            "System_ID": 21,
            "FunctionalityFather_ID": 114,
            "Active": 1,
            "Priority": 5,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1255,
                "Profile_ID": 68,
                "Functionality_ID": 119,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/general-register/product-line"
          },
          {
            "FunctionalityID": 120,
            "Name": "Product",
            "Action": "/product",
            "Icon": "shopping_cart",
            "System_ID": 21,
            "FunctionalityFather_ID": 114,
            "Active": 1,
            "Priority": 6,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1256,
                "Profile_ID": 68,
                "Functionality_ID": 120,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/general-register/product"
          }
        ],
        "ProfileFunctionalities": [
          {
            "ProfileFunctionalityID": 1250,
            "Profile_ID": 68,
            "Functionality_ID": 114,
            "CanInsert": false,
            "CanUpdate": false,
            "CanDelete": false
          }
        ],
        "ActionFull": "/general-register",
        "HasFunctionalities": true,
        "model": false
      },
      {
        "FunctionalityID": 99,
        "Name": "Budget Account",
        "Action": "/budget-account",
        "Icon": "monetization_on",
        "System_ID": 21,
        "FunctionalityFather_ID": null,
        "Active": 1,
        "Priority": 2,
        "FunctionalityChildren": [
          {
            "FunctionalityID": 100,
            "Name": "Sector",
            "Action": "/sector",
            "Icon": "account_balance",
            "System_ID": 21,
            "FunctionalityFather_ID": 99,
            "Active": 1,
            "Priority": 1,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1258,
                "Profile_ID": 68,
                "Functionality_ID": 100,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/budget-account/sector"
          },
          {
            "FunctionalityID": 101,
            "Name": "Group",
            "Action": "/group",
            "Icon": "group_work",
            "System_ID": 21,
            "FunctionalityFather_ID": 99,
            "Active": 1,
            "Priority": 2,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1259,
                "Profile_ID": 68,
                "Functionality_ID": 101,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/budget-account/group"
          },
          {
            "FunctionalityID": 102,
            "Name": "Account",
            "Action": "/account",
            "Icon": "attach_money",
            "System_ID": 21,
            "FunctionalityFather_ID": 99,
            "Active": 1,
            "Priority": 3,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1260,
                "Profile_ID": 68,
                "Functionality_ID": 102,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/budget-account/account"
          },
          {
            "FunctionalityID": 103,
            "Name": "Budget",
            "Action": "/budget",
            "Icon": "credit_card",
            "System_ID": 21,
            "FunctionalityFather_ID": 99,
            "Active": 1,
            "Priority": 4,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1261,
                "Profile_ID": 68,
                "Functionality_ID": 103,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/budget-account/budget"
          }
        ],
        "ProfileFunctionalities": [
          {
            "ProfileFunctionalityID": 1257,
            "Profile_ID": 68,
            "Functionality_ID": 99,
            "CanInsert": false,
            "CanUpdate": false,
            "CanDelete": false
          }
        ],
        "ActionFull": "/budget-account",
        "HasFunctionalities": true,
        "model": false
      },
      {
        "FunctionalityID": 105,
        "Name": "Budget",
        "Action": "/budget",
        "Icon": "credit_card",
        "System_ID": 21,
        "FunctionalityFather_ID": null,
        "Active": 1,
        "Priority": 3,
        "FunctionalityChildren": [
          {
            "FunctionalityID": 106,
            "Name": "Allocation",
            "Action": "/allocation",
            "Icon": "note_add",
            "System_ID": 21,
            "FunctionalityFather_ID": 105,
            "Active": 1,
            "Priority": 1,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1272,
                "Profile_ID": 68,
                "Functionality_ID": 106,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/budget/allocation"
          },
          {
            "FunctionalityID": 107,
            "Name": "Copy",
            "Action": "/copy",
            "Icon": "content_copy",
            "System_ID": 21,
            "FunctionalityFather_ID": 105,
            "Active": 1,
            "Priority": 2,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1273,
                "Profile_ID": 68,
                "Functionality_ID": 107,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/budget/copy"
          },
          {
            "FunctionalityID": 108,
            "Name": "In And Out",
            "Action": "/in-and-out",
            "Icon": "swap_vertical_circle",
            "System_ID": 21,
            "FunctionalityFather_ID": 105,
            "Active": 1,
            "Priority": 3,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1274,
                "Profile_ID": 68,
                "Functionality_ID": 108,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/budget/in-and-out"
          },
          {
            "FunctionalityID": 109,
            "Name": "Account Accounting",
            "Action": "/account-accounting",
            "Icon": "assignment",
            "System_ID": 21,
            "FunctionalityFather_ID": 105,
            "Active": 1,
            "Priority": 4,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1275,
                "Profile_ID": 68,
                "Functionality_ID": 109,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/budget/account-accounting"
          },
          {
            "FunctionalityID": 110,
            "Name": "Event",
            "Action": "/eventos",
            "Icon": "shopping_cart",
            "System_ID": 21,
            "FunctionalityFather_ID": 105,
            "Active": 1,
            "Priority": 5,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1276,
                "Profile_ID": 68,
                "Functionality_ID": 110,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/budget/eventos"
          },
          {
            "FunctionalityID": 111,
            "Name": "Copy Counter",
            "Action": "/copy-counter",
            "Icon": "swap_vertical_circle",
            "System_ID": 21,
            "FunctionalityFather_ID": 105,
            "Active": 1,
            "Priority": 6,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1277,
                "Profile_ID": 68,
                "Functionality_ID": 111,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/budget/copy-counter"
          }
        ],
        "ProfileFunctionalities": [
          {
            "ProfileFunctionalityID": 1271,
            "Profile_ID": 68,
            "Functionality_ID": 105,
            "CanInsert": false,
            "CanUpdate": false,
            "CanDelete": false
          }
        ],
        "ActionFull": "/budget",
        "HasFunctionalities": false,
        "model": false
      },
      {
        "FunctionalityID": 112,
        "Name": "Config",
        "Action": "/config",
        "Icon": "build",
        "System_ID": 21,
        "FunctionalityFather_ID": null,
        "Active": 1,
        "Priority": 4,
        "FunctionalityChildren": [
          {
            "FunctionalityID": 113,
            "Name": "Control Year Month",
            "Action": "/control-year-month",
            "Icon": "date_range",
            "System_ID": 21,
            "FunctionalityFather_ID": 112,
            "Active": 1,
            "Priority": 1,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1263,
                "Profile_ID": 68,
                "Functionality_ID": 113,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/config/control-year-month"
          }
        ],
        "ProfileFunctionalities": [
          {
            "ProfileFunctionalityID": 1262,
            "Profile_ID": 68,
            "Functionality_ID": 112,
            "CanInsert": false,
            "CanUpdate": false,
            "CanDelete": false
          }
        ],
        "ActionFull": "/config",
        "HasFunctionalities": true,
        "model": false
      },
      {
        "FunctionalityID": 121,
        "Name": "Report",
        "Action": "/report",
        "Icon": "picture_as_pdf",
        "System_ID": 21,
        "FunctionalityFather_ID": null,
        "Active": 1,
        "Priority": 5,
        "FunctionalityChildren": [
          {
            "FunctionalityID": 122,
            "Name": "Report 1",
            "Action": "/report-um",
            "Icon": "picture_as_pdf",
            "System_ID": 21,
            "FunctionalityFather_ID": 121,
            "Active": 1,
            "Priority": 1,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1265,
                "Profile_ID": 68,
                "Functionality_ID": 122,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/report/report-um"
          },
          {
            "FunctionalityID": 123,
            "Name": "Report 2",
            "Action": "/report-dois",
            "Icon": "picture_as_pdf",
            "System_ID": 21,
            "FunctionalityFather_ID": 121,
            "Active": 1,
            "Priority": 2,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1266,
                "Profile_ID": 68,
                "Functionality_ID": 123,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/report/report-dois"
          },
          {
            "FunctionalityID": 124,
            "Name": "Report 3",
            "Action": "/report-tres",
            "Icon": "picture_as_pdf",
            "System_ID": 21,
            "FunctionalityFather_ID": 121,
            "Active": 1,
            "Priority": 3,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1267,
                "Profile_ID": 68,
                "Functionality_ID": 124,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/report/report-tres"
          }
        ],
        "ProfileFunctionalities": [
          {
            "ProfileFunctionalityID": 1264,
            "Profile_ID": 68,
            "Functionality_ID": 121,
            "CanInsert": false,
            "CanUpdate": false,
            "CanDelete": false
          }
        ],
        "ActionFull": "/report",
        "HasFunctionalities": true,
        "model": false
      },
      {
        "FunctionalityID": 125,
        "Name": "Profile",
        "Action": "/profile",
        "Icon": "person",
        "System_ID": 21,
        "FunctionalityFather_ID": null,
        "Active": 1,
        "Priority": 6,
        "FunctionalityChildren": [
          {
            "FunctionalityID": 126,
            "Name": "New",
            "Action": "/new",
            "Icon": "plus_one",
            "System_ID": 21,
            "FunctionalityFather_ID": 125,
            "Active": 1,
            "Priority": 1,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1269,
                "Profile_ID": 68,
                "Functionality_ID": 126,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/profile/new"
          },
          {
            "FunctionalityID": 127,
            "Name": "List",
            "Action": "/list",
            "Icon": "view_list",
            "System_ID": 21,
            "FunctionalityFather_ID": 125,
            "Active": 1,
            "Priority": 2,
            "ProfileFunctionalities": [
              {
                "ProfileFunctionalityID": 1270,
                "Profile_ID": 68,
                "Functionality_ID": 127,
                "CanInsert": true,
                "CanUpdate": true,
                "CanDelete": true
              }
            ],
            "ActionFull": "/profile/list"
          }
        ],
        "ProfileFunctionalities": [
          {
            "ProfileFunctionalityID": 1268,
            "Profile_ID": 68,
            "Functionality_ID": 125,
            "CanInsert": false,
            "CanUpdate": false,
            "CanDelete": false
          }
        ],
        "ActionFull": "/profile",
        "HasFunctionalities": true,
        "model": false
      }
    ]

The code above works for me but I think exist another code more sugar and I want learn it:

let all = bigArray.reduce((prev, next) => {
   return prev.concat(next.FunctionalityChildren)
}, [])

bigArray.reduce((prev, next) => all.push(next), [])

let desired1 = '/budget'
let desired2 = '/budget/allocation'

let element1 = all.find(e=>e.ActionFull === desired1) // return the object that contains ActionFull = '/budget' (can be father)
let element2 = all.find(e=>e.ActionFull === desired2) // return the object that contains ActionFull = '/budget/allocation' (can be child)

console.log(element1)
console.log(element2)

Pay attention, as I showed above, It can be a father or a child.

felipe muner
  • 357
  • 2
  • 6
  • 13
  • 1
    If you have a working code and just want something prettier, maybe ask https://codereview.stackexchange.com/ ? – Denys Séguret May 21 '18 at 12:31
  • Denys, I created: https://codereview.stackexchange.com/questions/194867/find-object-in-array-with-subarray-checking-an-property – felipe muner May 21 '18 at 13:24

2 Answers2

4

Here's how we expect our generic deepFind function to work

deepFind (x => x.ActionFull === '/budget', bigArray)
// { FunctionalityID: 105, Name: 'Budget', ActionFull: '/budget' ... }

deepFind (x => x.ActionFull === '/budget/allocation', bigArray)
// { FunctionalityID: 106, Name: 'Allocation', ActionFull: '/budget/allocation' }

I'm going to give you the imperative style solution in hopes that this gets you thinking about how you will need to structure your function calls. Notice that this program will begin iterating thru a possible set of solutions but it stops iterating and returns a result as soon as a match is found. Using Array#reduce or Array#map or Array#filter is inadequate for this task as they do not have the short-circuiting behavior we're looking for

Run the program below in your browser, this time with a simplified data set. It's should be easy to follow how we arrive at the result

const data =
  [ { a: 1, b: 1 }
  , { a: 2, b: 2, c: { d: [ { e: 2 } ] } }
  , { a: 3, b: { c: { d: { e: { f: 3 } } } } }
  ]

const deepFind = (f, obj = {}) =>
{ if (Object (obj) === obj)
  { if (f (obj) === true)
      return obj

    for (const [ k, v ] of Object.entries (obj))
    { const res =
        deepFind (f, v)
      
      if (res !== undefined)
        return res
    }
  }

  return undefined
}

console.log
  ( deepFind (x => x.a === 1, data)             // { a: 1, b: 1 }
  , deepFind (x => x.e === 2, data)             // { e: 2 }
  , deepFind (x => Array.isArray(x.d), data)    // { d: [ { e: 2 } ] }
  , deepFind (x => x.f === 3, data)             // { f: 3 }
  , deepFind (x => x.e && x.e.f === 3, data)    // { e: { f: 3 } }
  , deepFind (x => x.z === 9, data)             // undefined
  )

deepFind works for all objects, arrays included

const alpha =
  [ [ 'a', 'b', 'c' ], [ 'd', 'e', 'f' ], [ 'g', 'h', 'i' ] ]

deepFind (x => x [1] === 'h', alpha)
// [ 'g', 'h', 'i', ]

deepFind (([ _0, _1, _2 ]) => _2 === 'f', alpha)
// [ 'd', 'e', 'f' ]

Expressing deepFind as a functional program requires only the translation of an iterative loop to a recursive function with state parameters. Because you design the recursive function yourself, you can encode the short-circuit behavior this program requires.

Below, deepFind is written using a pure functional expression. State parameters v and rest are added but only f and o are meant to be specified by the user, like we did above. If you didn't want these as part your function's public interface, an internal auxiliary function could be used instead.

const identity = x =>
  x

const None =
  Symbol ()

const deepFind = (f = identity, o = {}, [ _, v ] = [ None, None ], ...rest) =>
  Object (o) === o
    ? f (o) === true
      ? o
      : v === None
        ? deepFind (f, null, ...Object.entries (o))
        : deepFind (f, v, ...rest, ...Object.entries (o)) 
    : v === None
      ? undefined
      : deepFind (f, v, ...rest )

Re-run the program to verify that the output is indeed the same

const identity = x =>
  x

const None =
  Symbol ()

const deepFind = (f = identity, o = {}, [ _, v ] = [ None, None ], ...rest) =>
  Object (o) === o
    ? f (o) === true
      ? o
      : v === None
        ? deepFind (f, null, ...Object.entries (o))
        : deepFind (f, v, ...rest, ...Object.entries (o)) 
    : v === None
      ? undefined
      : deepFind (f, v, ...rest )

const data =
  [ { a: 1, b: 1 }
  , { a: 2, b: 2, c: { d: [ { e: 2 } ] } }
  , { a: 3, b: { c: { d: { e: { f: 3 } } } } }
  ]

console.log
  ( deepFind (x => x.a === 1, data)             // { a: 1, b: 1 }
  , deepFind (x => x.e === 2, data)             // { e: 2 }
  , deepFind (x => Array.isArray(x.d), data)    // { d: [ { e: 2 } ] }
  , deepFind (x => x.f === 3, data)             // { f: 3 }
  , deepFind (x => x.e && x.e.f === 3, data)    // { e: { f: 3 } }
  , deepFind (x => x.z === 9, data)             // undefined
  )

const alpha =
  [ [ 'a', 'b', 'c' ], [ 'd', 'e', 'f' ], [ 'g', 'h', 'i' ] ]

console.log
  ( deepFind (x => x [1] === 'h', alpha)              // [ 'g', 'h', 'i', ]
  , deepFind (([ _0, _1, _2 ]) => _2 === 'f', alpha)  // [ 'd', 'e', 'f' ]
  )

Lastly, here's a deepFindAll. In this variation of the program, instead of getting a single answer or undefined, we get an array of zero or more results. This demonstrates the auxiliary loop I mentioned in the previous example and also a beautiful use case for generators.

As an exercise, I encourage you to rewrite deepFindAll below using a functional expression in place of the auxiliary generator

const deepFindAll = (f, o = {}) =>
{ const aux =
    function* (f, o)
    { if (Object (o) === o)
      { if (f (o) === true)
          yield o
        for (const [ _, v ] of Object.entries (o))
          yield* aux (f, v)
      }
    }
  return Array.from (aux (f, o))
}

const data =
  [ { a: 1, b: 1 }
  , { a: 2, b: 2, c: { d: [ { e: 2 } ] } }
  , { a: 3, b: { c: { d: { e: { f: 3 } } } } }
  ]

console.log
  ( deepFindAll (x => x.a === 1 || x.e === 2, data)  // [ { a: 1, b: 1 }, { e: 2 } ]
  , deepFindAll (x => x.e !== undefined, data)       //[ { e: 2 }, { e: { f: 3 } } ]
  , deepFindAll (x => x.z === 9, data)               // []
  )
Mulan
  • 129,518
  • 31
  • 228
  • 259
  • Hello friend, many thanks for your answer. I'll create a new question and desired you answer there. One moment, I'll post here. =) – felipe muner May 21 '18 at 21:05
  • @felipemuner please do not duplicate this question. If you'd like, we can discuss here... – Mulan May 21 '18 at 21:06
  • I wanted just that, perfect answer. Ok, sorry. Let's do it by steps. First: the function deepFind have 2 parameter, why you declare _obj_ as `obj = {}` and not simple a varible obj ? – felipe muner May 21 '18 at 21:24
  • 1
    `deepFind (f, obj)` would also be fine. I've been using default arguments for a while now and I think it helps readability in most cases. – Mulan May 21 '18 at 21:26
  • 1
    @felipemuner I added `deepFind` in functional style and `deepFindAll` for additional learning – Mulan May 22 '18 at 03:32
  • @user633182 i don't understand what you means, can you be a bit more clearly? thx – felipe muner May 23 '18 at 11:25
  • @felipemuner where are you having trouble? – Mulan May 23 '18 at 14:55
2

Since you have to find the unique item, you can use find method. The find() method returns the value of the first element in the array that satisfies the provided testing function. Otherwise undefined is returned.

Also, you can use map method and spread syntax in order to find out all the children elements from the bigArray elements.

The map() method creates a new array with the results of calling a provided callback function on every element in the calling array.

let bigArray = [ { "FunctionalityID": 114, "Name": "General Register", "Action": "/general-register", "Icon": "settings_input_composite", "System_ID": 21, "FunctionalityFather_ID": null, "Active": 1, "Priority": 1, "FunctionalityChildren": [ { "FunctionalityID": 115, "Name": "Supplier", "Action": "/supplier", "Icon": "perm_contact_calendar", "System_ID": 21, "FunctionalityFather_ID": 114, "Active": 1, "Priority": 1, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1251, "Profile_ID": 68, "Functionality_ID": 115, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/general-register/supplier" }, { "FunctionalityID": 116, "Name": "RPA", "Action": "/rpa", "Icon": "view_day", "System_ID": 21, "FunctionalityFather_ID": 114, "Active": 1, "Priority": 2, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1252, "Profile_ID": 68, "Functionality_ID": 116, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/general-register/rpa" }, { "FunctionalityID": 117, "Name": "Cost Center", "Action": "/cost-center", "Icon": "home", "System_ID": 21, "FunctionalityFather_ID": 114, "Active": 1, "Priority": 3, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1253, "Profile_ID": 68, "Functionality_ID": 117, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/general-register/cost-center" }, { "FunctionalityID": 118, "Name": "Departament", "Action": "/departament", "Icon": "donut_small", "System_ID": 21, "FunctionalityFather_ID": 114, "Active": 1, "Priority": 4, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1254, "Profile_ID": 68, "Functionality_ID": 118, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/general-register/departament" }, { "FunctionalityID": 119, "Name": "Product Line", "Action": "/product-line", "Icon": "view_headline", "System_ID": 21, "FunctionalityFather_ID": 114, "Active": 1, "Priority": 5, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1255, "Profile_ID": 68, "Functionality_ID": 119, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/general-register/product-line" }, { "FunctionalityID": 120, "Name": "Product", "Action": "/product", "Icon": "shopping_cart", "System_ID": 21, "FunctionalityFather_ID": 114, "Active": 1, "Priority": 6, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1256, "Profile_ID": 68, "Functionality_ID": 120, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/general-register/product" } ], "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1250, "Profile_ID": 68, "Functionality_ID": 114, "CanInsert": false, "CanUpdate": false, "CanDelete": false } ], "ActionFull": "/general-register", "HasFunctionalities": true, "model": false }, { "FunctionalityID": 99, "Name": "Budget Account", "Action": "/budget-account", "Icon": "monetization_on", "System_ID": 21, "FunctionalityFather_ID": null, "Active": 1, "Priority": 2, "FunctionalityChildren": [ { "FunctionalityID": 100, "Name": "Sector", "Action": "/sector", "Icon": "account_balance", "System_ID": 21, "FunctionalityFather_ID": 99, "Active": 1, "Priority": 1, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1258, "Profile_ID": 68, "Functionality_ID": 100, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/budget-account/sector" }, { "FunctionalityID": 101, "Name": "Group", "Action": "/group", "Icon": "group_work", "System_ID": 21, "FunctionalityFather_ID": 99, "Active": 1, "Priority": 2, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1259, "Profile_ID": 68, "Functionality_ID": 101, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/budget-account/group" }, { "FunctionalityID": 102, "Name": "Account", "Action": "/account", "Icon": "attach_money", "System_ID": 21, "FunctionalityFather_ID": 99, "Active": 1, "Priority": 3, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1260, "Profile_ID": 68, "Functionality_ID": 102, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/budget-account/account" }, { "FunctionalityID": 103, "Name": "Budget", "Action": "/budget", "Icon": "credit_card", "System_ID": 21, "FunctionalityFather_ID": 99, "Active": 1, "Priority": 4, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1261, "Profile_ID": 68, "Functionality_ID": 103, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/budget-account/budget" } ], "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1257, "Profile_ID": 68, "Functionality_ID": 99, "CanInsert": false, "CanUpdate": false, "CanDelete": false } ], "ActionFull": "/budget-account", "HasFunctionalities": true, "model": false }, { "FunctionalityID": 105, "Name": "Budget", "Action": "/budget", "Icon": "credit_card", "System_ID": 21, "FunctionalityFather_ID": null, "Active": 1, "Priority": 3, "FunctionalityChildren": [ { "FunctionalityID": 106, "Name": "Allocation", "Action": "/allocation", "Icon": "note_add", "System_ID": 21, "FunctionalityFather_ID": 105, "Active": 1, "Priority": 1, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1272, "Profile_ID": 68, "Functionality_ID": 106, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/budget/allocation" }, { "FunctionalityID": 107, "Name": "Copy", "Action": "/copy", "Icon": "content_copy", "System_ID": 21, "FunctionalityFather_ID": 105, "Active": 1, "Priority": 2, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1273, "Profile_ID": 68, "Functionality_ID": 107, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/budget/copy" }, { "FunctionalityID": 108, "Name": "In And Out", "Action": "/in-and-out", "Icon": "swap_vertical_circle", "System_ID": 21, "FunctionalityFather_ID": 105, "Active": 1, "Priority": 3, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1274, "Profile_ID": 68, "Functionality_ID": 108, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/budget/in-and-out" }, { "FunctionalityID": 109, "Name": "Account Accounting", "Action": "/account-accounting", "Icon": "assignment", "System_ID": 21, "FunctionalityFather_ID": 105, "Active": 1, "Priority": 4, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1275, "Profile_ID": 68, "Functionality_ID": 109, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/budget/account-accounting" }, { "FunctionalityID": 110, "Name": "Event", "Action": "/eventos", "Icon": "shopping_cart", "System_ID": 21, "FunctionalityFather_ID": 105, "Active": 1, "Priority": 5, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1276, "Profile_ID": 68, "Functionality_ID": 110, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/budget/eventos" }, { "FunctionalityID": 111, "Name": "Copy Counter", "Action": "/copy-counter", "Icon": "swap_vertical_circle", "System_ID": 21, "FunctionalityFather_ID": 105, "Active": 1, "Priority": 6, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1277, "Profile_ID": 68, "Functionality_ID": 111, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/budget/copy-counter" } ], "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1271, "Profile_ID": 68, "Functionality_ID": 105, "CanInsert": false, "CanUpdate": false, "CanDelete": false } ], "ActionFull": "/budget", "HasFunctionalities": false, "model": false }, { "FunctionalityID": 112, "Name": "Config", "Action": "/config", "Icon": "build", "System_ID": 21, "FunctionalityFather_ID": null, "Active": 1, "Priority": 4, "FunctionalityChildren": [ { "FunctionalityID": 113, "Name": "Control Year Month", "Action": "/control-year-month", "Icon": "date_range", "System_ID": 21, "FunctionalityFather_ID": 112, "Active": 1, "Priority": 1, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1263, "Profile_ID": 68, "Functionality_ID": 113, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/config/control-year-month" } ], "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1262, "Profile_ID": 68, "Functionality_ID": 112, "CanInsert": false, "CanUpdate": false, "CanDelete": false } ], "ActionFull": "/config", "HasFunctionalities": true, "model": false }, { "FunctionalityID": 121, "Name": "Report", "Action": "/report", "Icon": "picture_as_pdf", "System_ID": 21, "FunctionalityFather_ID": null, "Active": 1, "Priority": 5, "FunctionalityChildren": [ { "FunctionalityID": 122, "Name": "Report 1", "Action": "/report-um", "Icon": "picture_as_pdf", "System_ID": 21, "FunctionalityFather_ID": 121, "Active": 1, "Priority": 1, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1265, "Profile_ID": 68, "Functionality_ID": 122, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/report/report-um" }, { "FunctionalityID": 123, "Name": "Report 2", "Action": "/report-dois", "Icon": "picture_as_pdf", "System_ID": 21, "FunctionalityFather_ID": 121, "Active": 1, "Priority": 2, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1266, "Profile_ID": 68, "Functionality_ID": 123, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/report/report-dois" }, { "FunctionalityID": 124, "Name": "Report 3", "Action": "/report-tres", "Icon": "picture_as_pdf", "System_ID": 21, "FunctionalityFather_ID": 121, "Active": 1, "Priority": 3, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1267, "Profile_ID": 68, "Functionality_ID": 124, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/report/report-tres" } ], "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1264, "Profile_ID": 68, "Functionality_ID": 121, "CanInsert": false, "CanUpdate": false, "CanDelete": false } ], "ActionFull": "/report", "HasFunctionalities": true, "model": false }, { "FunctionalityID": 125, "Name": "Profile", "Action": "/profile", "Icon": "person", "System_ID": 21, "FunctionalityFather_ID": null, "Active": 1, "Priority": 6, "FunctionalityChildren": [ { "FunctionalityID": 126, "Name": "New", "Action": "/new", "Icon": "plus_one", "System_ID": 21, "FunctionalityFather_ID": 125, "Active": 1, "Priority": 1, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1269, "Profile_ID": 68, "Functionality_ID": 126, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/profile/new" }, { "FunctionalityID": 127, "Name": "List", "Action": "/list", "Icon": "view_list", "System_ID": 21, "FunctionalityFather_ID": 125, "Active": 1, "Priority": 2, "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1270, "Profile_ID": 68, "Functionality_ID": 127, "CanInsert": true, "CanUpdate": true, "CanDelete": true } ], "ActionFull": "/profile/list" } ], "ProfileFunctionalities": [ { "ProfileFunctionalityID": 1268, "Profile_ID": 68, "Functionality_ID": 125, "CanInsert": false, "CanUpdate": false, "CanDelete": false } ], "ActionFull": "/profile", "HasFunctionalities": true, "model": false } ]

let action_full = '/budget/allocation';
   
let result = [].concat(...bigArray.map(elem => elem.FunctionalityChildren))
               .find(a => a.ActionFull == action_full); // It work only to children objects.

console.log(result);

let findedInFatherAndChild = bigArray.concat(...bigArray.map(elem => elem.FunctionalityChildren)).find(a => a.ActionFull === '/budget') // This work for me, both for father and children. Thanks Mihai
felipe muner
  • 357
  • 2
  • 6
  • 13
Mihai Alexandru-Ionut
  • 47,092
  • 13
  • 101
  • 128
  • Hello, it's not exactly what I want, your way I return the object father(object that contains the child desired), I need return only the object that matches the property ActionFull, this object can be father or child – felipe muner May 21 '18 at 12:39
  • @felipemuner, have a look now. – Mihai Alexandru-Ionut May 21 '18 at 12:42
  • Hi Mihai, it's still not working of the way i desired. Now the code return only child, and the thuth is: my ActionFull can be father or child. I'll edit my question to more clarification but you can test my code with: `let element = all.find(e=>e.ActionFull === '/budget/allocation')` `let element = all.find(e=>e.ActionFull === '/budget')` It will show to you what I want. – felipe muner May 21 '18 at 12:51
  • Done, I finished It with this code: `bigArray.concat(...bigArray.map(elem => elem.FunctionalityChildren)).find(a => a.ActionFull === '/budget')` – felipe muner May 21 '18 at 13:14
  • `[].concat(...arr.map(f))` is [`arr.flatMap(f)`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap) – Mulan May 21 '18 at 20:07
  • @felipemuner the solution above only works if you're searching for 1st-level children – ie, this would not find grand children, or great grand children. Does your data allow for deeper ancestries? – Mulan May 21 '18 at 20:09