将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 /下划线帮助吗?

作为一个额外的通才。输入(第一个参数)如何是具有嵌套级别的通用集合(嵌套级别的数组或对象的数组或对象)?谢谢。

答案

你可以使用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 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使用forEachwill返回一系列关键匹配的元素

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

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

具有特定键和值的通用类型

在 C# 中将 HashTable 转换为字典

Apache Drill 与 mongodb。在地图中查询具有特定键和值的文档