Получить массив из вложенного массива объектов - PullRequest
0 голосов
/ 08 мая 2019

Хотелось бы узнать, есть ли способ извлечь значения из объектов во вложенных массивах, в какой-то комбинации с lodash get:

const obj = { arr: [{ a: 2 },{ a: 3 }] };
get(obj, 'arr.a'); // [2, 3]

Но это все равно должно работать для других целей:

const obj = { nestedObj: { a: 4 } };
get(obj, 'nestedObj.a'); // 4

Это какой-то продвинутый метод get, который работает так, как вы ожидаете, если вы забудете о массиве, объектах и ​​т. Д.

Ответы [ 3 ]

0 голосов
/ 08 мая 2019

Вы можете создать рекурсивную функцию, которая перебирает ключи и извлекает значения.Если типом значения является массив, он использует Array.map() (может быть Array.flatMap() для обработки вложенных массивов) для его итерации.

const getFn = (path, obj) => {
  const inner = ([key, ...path], obj) => {
    if(!path.length) return obj[key];

    return Array.isArray(obj[key]) ?
      obj[key].map(o => inner(path, o)) :
      inner(path, obj[key]);
  }
  
  return inner(path.split('.'), obj);
}
  


console.log(getFn('arr.a', { arr: [{ a: 2 },{ a: 3 }] }));
console.log(getFn('nestedObj.a', { nestedObj: { a: 4 } }));
console.log(getFn('arr.a.b', { arr: [{ a: [{ b: 1 }, { b: 2 }] },{ a: [{ b: 1 }, { b: 2 }] }] }));
0 голосов
/ 08 мая 2019

Вы можете использовать полный динамический подход и искать заданные ключи и брать части, где ключ совпадает.

Результатом всегда является массив.

При необходимости вы можете добавить чек, который вытаскивает единственный элемент и возвращает его.

function getValues(object, path) {
    var [key, ...rest] = path.split('.');
    if (!rest.length && key in object) return [object[key]];
    return Object.entries(object).reduce((r, [k, v]) => {
        if (!v || typeof v !== 'object') return r;
        if (k === key) r.push(...getValues(v, rest.join('.')));
        r.push(...getValues(v, path));
        return r;
    }, []);
}


console.log(getValues({ arr: [{ a: 2 }, { a: 3 }] }, 'arr.a')); // [2, 3]
console.log(getValues({ nestedObj: { a: 4 } }, 'nestedObj.a')); // 4
0 голосов
/ 08 мая 2019

Я не думаю, что это возможно при использовании lodash, посмотрите вместо этого путь json.Соответствующий запрос пути JSON будет arr[*].a.См. Рабочий пример ниже, где я использую эту реализацию пути json.Есть еще несколько реализаций, выберите ту, которая подходит вам лучше всего.

const obj = { arr: [{ a: 2 },{ a: 3 }] };
console.log(jsonpath.query(obj, "arr[*].a")); // [2, 3]
<script src="https://cdn.jsdelivr.net/npm/jsonpath@1.0.1/jsonpath.js"></script>
...