繁体   English   中英

将JS集合转换为具有特定键和分组值的对象

[英]Transform JS collection to an object with specific keys and grouped values

我想使用以下参数创建此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 / underscore辅助工具?

作为附加的普遍性。 输入(第一个参数)如何成为具有嵌套级别(数组或对象的嵌套级别的数组或对象)的泛型集合? 谢谢。

尝试这个:

 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方法的函数。 使用forEach getMatchedKeyValues将返回键匹配的元素数组

 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)) 

您可以使用Array.prototype.reduce

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 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"] ) ); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM