从对象的嵌套数组中获取数组

时间:2019-05-08 15:20:45

标签: javascript lodash

我想知道是否有一种方法可以用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

这是一种高级的“获取”功能,如果您忘记了数组和对象等,它将按您期望的方式工作。

3 个答案:

答案 0 :(得分:0)

我认为使用lodash不可能实现,而是查找json路径。相应的JSON路径查询将为arr[*].a。请参阅下面的工作示例,其中我使用this 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>

答案 1 :(得分:0)

您可以创建一个遍历键并提取值的递归函数。如果值的类型是数组,则它使用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 }] }] }));

答案 2 :(得分:0)

您可以采用完整的动态方法,查找给定的键,然后选择键匹配的部分。

结果始终是一个数组。

如果需要,您可以添加一张支票,该支票将拉出唯一的物品并将其退回。

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