将通用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 将具有相同类型的字典分组到具有完整键和值的数组中

如何将平面 DataFrame 对象转换为具有多个列级别且也按特定维度分组的 DataFrame 对象?

Swift - 具有实现通用协议的值的 Typealias 字典