Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用下划线获取所有键以及每个键的唯一值列表_Javascript_Arrays_Functional Programming_Underscore.js_Lodash - Fatal编程技术网

Javascript 使用下划线获取所有键以及每个键的唯一值列表

Javascript 使用下划线获取所有键以及每个键的唯一值列表,javascript,arrays,functional-programming,underscore.js,lodash,Javascript,Arrays,Functional Programming,Underscore.js,Lodash,从一个对象数组开始,我需要获得所有键的列表以及每个键的所有唯一值。问题是我事先不知道钥匙。如果知道键,有很多解决方案,但在这种情况下,每个对象可以有任意数量的键,每个键都有一个值数组。下面的代码可以工作,但它相当复杂,必须有一个更简单的解决方案 输入: [ { key_1: [ attribute_value_1, attribute_value_2, ... ], key_2: [ attribute_value_3, attribute_value_

从一个对象数组开始,我需要获得所有键的列表以及每个键的所有唯一值。问题是我事先不知道钥匙。如果知道键,有很多解决方案,但在这种情况下,每个对象可以有任意数量的键,每个键都有一个值数组。下面的代码可以工作,但它相当复杂,必须有一个更简单的解决方案

输入:

[
    {
        key_1: [ attribute_value_1, attribute_value_2, ... ],
        key_2: [ attribute_value_3, attribute_value_4, ... ],
    },
    ...
] 
输出:

[
    {
        label: key_1,
        options: [ attribute_value_1, attribute_value_2, ... ]
    },
    {
        label: key_2,
        options: [ attribute_value_3, attribute_value_4, ... ]
    },
    ...
]
建议的解决办法:

    _.chain(input)
        .map(function (attr) {
            return _.keys(attr).map(function (key) {
                return {
                    key: key,
                    value: attr[key]
                };
            });
        })
        .flatten()
        .groupBy('key')
        .map(function (grouped_values, key) {
            // value = array of { key, value }
            return {
                label: key,
                options: _.chain(grouped_values)
                    .pluck('value')
                    .flatten()
                    .uniq()
                    .value()
            };
        })
        .value();
使用lodash-应用于输入数组,并使用customizer函数组合数组并获得唯一值。然后将结果转换为所需格式:

var输入=[
{
键1:[“属性值1”,“属性值2”],
键2:[“属性值3”,“属性值4”]
},
{
键1:[“属性值1”,“属性值5”],
键2:[“属性值2”,“属性值3”],
键5:[“属性值2”,“属性值3”]
}
];
var params=[{}].concat(输入).concat(函数(objValue,srcValue){//创建要应用于mergeWith的参数
if(uu.isArray(objValue)){
return u.union(objValue,srcValue);//合并数组,并获取唯一值
}
});
var result=\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
返回{
标签:键,
选项:值
};
});
控制台日志(结果)

如果愿意,您可以用下划线书写,但没有迫切需要这样做

const输入=[
{键1:[1,2],键2:[3,4]},
{键3:[5,6],键2:[7,42]}
];
var result=[].concat(…input.map(obj=>
Object.keys(obj.map)(key=>
({label:key,options:obj[key]})
)
));

控制台日志(结果)完美!这正是我想要的。谢谢那真是太好了,但不是我想要的。如果您运行代码,“key_2”将有两个单独的条目,因此必须有另一个步骤按标签对数组进行分组。[].concat(…x)实现了什么?我只需要运行input.map()