将JS集合转换为具有特定键和分组值的对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将JS集合转换为具有特定键和分组值的对象相关的知识,希望对你有一定的参考价值。
我想用这些参数创建这个JS函数:
transform([{a:1, b:'1', c:true},{a:'1', b:2, c:3, d:false}, {a:1, c:'test'}], ['a','b','c']);
第一个参数是一个对象数组
第二个是键数组。
我想得到这个输出对象:
{a:[1, '1', 1], b:['1', 2],c:[true, 3, 'test']}
如您所见,第二个参数成为创建对象的键,这些键下的所有值组合在一起。
也许可以选择将唯一参数传递给函数并获取此值(删除重复值):
{a:[1, '1'], b:['1', 2], c:[true, 3, 'test']}
这种快速和/或优雅的方式是什么?
它有任何lodash /下划线帮助吗?
作为一个额外的通才。输入(第一个参数)如何是具有嵌套级别的通用集合(嵌套级别的数组或对象的数组或对象)?谢谢。
答案
let param1 = [{a:1,b:'1',c:true},{a:'1',b:2,c:3,d:false},{a:1,c:'test'}];
let param2 = ['a', 'b', 'c'];
function test(objArr, keys) {
let returnObject = {};
keys.forEach(key => returnObject[key] = []);
return objArr.reduce((ret, obj) => {
keys.forEach(key => {
if (obj[key] !== undefined)
ret[key].push(obj[key]);
});
return ret;
}, returnObject);
}
console.log(JSON.stringify(test(param1, param2)));
输出:
{"a":[1,"1",1],"b":["1",2],"c":[true,3,"test"]}
另一答案
试试这个:
function transform(data,keys){
let results = {};
//loop all you keys
keys.forEach(index => {
//loop your arrays
data.forEach(element => {
//if there is a match add the key to the results object
if(index in element) {
if(!(index in results)) results[index] = [];
//check if a value already exists for a given key.
if(!(element[index] in results[index])) results[index].push(element[index]);
}
});
});
return results;
}
console.log(transform([{a:1,b:'1',c:true},{a:'1',b:2,c:3,d:false},{a:1,c:'test'}], ['a','b','c']));
另一答案
您可以遍历键数组并将此键传递给另一个将使用forEach
方法的函数。这个getMatchedKeyValues
使用forEach
will返回一系列关键匹配的元素
var arr = [{
a: 1,
b: '1',
c: true
}, {
a: '1',
b: 2,
c: 3,
d: false
}, {
a: 1,
c: 'test'
}];
var keys = ['a', 'b', 'c']
function transform(keyArray) {
var newObj = {};
// looping over key array
keyArray.forEach(function(item) {
// adding key property and calling a function which will return
// an array of elements whose key is same
newObj[item] = getMatchedKeyValues(item)
})
return newObj;
}
function getMatchedKeyValues(keyName) {
var valArray = [];
arr.forEach(function(item) {
if (item[keyName]) {
valArray.push(item[keyName])
}
})
return valArray;
}
console.log(transform(keys))
另一答案
我编码如下,请看看这个解决方案。
function test(arr, arr1) {
return arr.reduce((total, current) => {
arr1.forEach(curr => {
if (typeof total[curr] === "undefined") total[curr] = [];
if (current[curr]) total[curr].push(current[curr]);
});
return total;
}, {});
}
console.log(
test(
[
{ a: 1, b: "1", c: true },
{ a: "1", b: 2, c: 3, d: false },
{ a: 1, c: "test" }
],
["a", "b", "c"]
)
);
以上是关于将JS集合转换为具有特定键和分组值的对象的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 将具有相同类型的字典分组到具有完整键和值的数组中