将通用JS集合转换为具有特定键和分组值的对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将通用JS集合转换为具有特定键和分组值的对象相关的知识,希望对你有一定的参考价值。
我想创建一个JS函数,将一个泛型集合(一个数组或对象的数组或对象的嵌套级别)转换为一个对象,其键是一个输入数组参数(如果提供,如果不是所有不同的对象键在输入中)和值是输入中这些键的叶值数组。如果提供标记,则叶值可以是不同的。
就像是:
transform([{a:1, b:'1', c:true, d:1},{a:'1', b:2, c:3, d:false}, {a:1, c:'test'}], ['a','b','c'], true);
要么
transform({x:{b:2,c:{c:3, d:1}},b:'1',z:{b:2,c:true,a:1},a:'1',g:{c:'test',d:false}}, ['a','b','c'], true);
会产生相同的输出:
{a:[1, '1'], b:['1', 2], c:[true, 3, 'test']}
- 第一个参数是集合 - 强制性
- 第二个是键数组 - 可选
- 第三个参数是唯一标志 - 可选
如果省略第二个参数。它会产生这个:
{a:[1, '1'], b:['1', 2], c:[true, 3, 'test'], d:[1,false]}
这种快速和/或优雅的方式是什么?
是否有任何lodash /下划线帮助器。
谢谢。
答案
基础
这个问题的主要部分是递归地遍历对象树并收集值。
为此,我们编写一个查看值的函数,并确定它是否为对象。如果不是,我们将值连接到结果数组。如果是,我们使用相同的逻辑减少其值。
const deepValues = (obj, res = []) =>
isObject(obj)
? Object.values(obj).reduce(flip(deepValues), res)
: res.concat(obj)
console.log(
deepValues({x:{b:2,c:{c:3, d:1}}})
);
// Utils
function flip(f) { return (x, y) => f(y, x) };
function isObject(x) { return Object.prototype.toString.call(x) === "[object Object]" };
以上是关于将通用JS集合转换为具有特定键和分组值的对象的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 将具有相同类型的字典分组到具有完整键和值的数组中