Как с помощью lodash вытащить элемент

88
12 июня 2021, 10:20

Всем привет, не до конца разобралась с lodash Подскажите, пожалуйста как вытащить из данных элемент

Массив

const arr = [
  {
    label: 'Элемент 1'
    insideArr: [
      {
        id: 1,
      }
    ]
  },
  {
    label: 'Элемент 2'
    insideArr: [
      {
        id: 2,
      }
    ]
  },
]

Нужно получить объект { id: 2 } id которого равно 2 (item.id === 2) Хотелось бы сделать это одной строкой

Функция рабочая, хотелось бы с помощью lodash как то написать в одну строку

export const getData = (arr, id) => {
  const findObj = _.find(arr, { insideArr: [{ id }] })
  return _.find(findObj, item => item. id === id)
}
Answer 1

var a = [ 
  { label: 'Элемент 1', insideArr: [{ id: 1 }] }, 
  { label: 'Элемент 2', insideArr: [{ id: 2 }, { id: 3 }] }, 
] 
 
console.log(_.find(_.flatten(_.map(a, 'insideArr')), { id: 2 })) // lodash 
console.log(a.flatMap(x => x.insideArr).find(x => x.id === 2))   // pure ES2019
<script src="//cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

Answer 2

Почему именно lodash? Так не пойдёт?

const obj = arr.find((el) => {
    return el.insideArr.find((el) => {
        return el.id === 2
    })
})
Answer 3

с учетом различных возможных значений id , а так же возможности содержания в insideArr нескольких объектов то думаю такой вариант наиболее подходящий:

const arr = [ 
  { 
    label: 'Элемент 1', 
    insideArr: [ 
      { 
        id: 1, 
      } 
    ] 
  }, 
  { 
    label: 'Элемент 2', 
    insideArr: [ 
      { 
        id: 2, 
      } 
    ] 
  }, 
] 
 
function getItemFromId(arr,id){ 
  return arr.filter(item=> _.get(item,'insideArr',[]).find(item=>_.get(item,'id',null)===id) 
  ) 
} 
console.log(getItemFromId(arr,2))
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

Answer 4

Возможно этот вариант Вас устроит:

_.find(arr, { 'insideArr': [{ 'id': 2 }] })

const arr = [ 
  { 
    label: 'Элемент 1', 
    insideArr: [ 
      { 
        id: 1, 
      } 
    ] 
  }, 
  { 
    label: 'Элемент 2', 
    insideArr: [ 
      { 
        id: 2, 
        name: 'Abraham', 
      }, 
      { 
        garbage: { no: 'problem' } 
      } 
    ] 
  } 
] 
 
const res = _.find(arr, { 'insideArr': [{ 'id': 2 }] }) 
console.log(res)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

источник Переданный вместо предиката объект используется для проверки на частичное совпадение с искомым объектом коллекции (как подмножество свойств искомого объекта).

READ ALSO
Баг с blur(), помогите пожалуйста!

Баг с blur(), помогите пожалуйста!

Доброго времени суток!

98
Вложенные блоки не заполняют всю высоту родителя без явного указания height

Вложенные блоки не заполняют всю высоту родителя без явного указания height

Если задать блоку min-height вместо явного height, то в IE внутренние блоки не будут заполнять его по высоте полностью; в других браузерах все нормальноЕсть...

86