使用 Javascript 将字典列表转换为列表字典

时间:2020-12-21 11:43:28

标签: javascript list dictionary

是否有内置的 Javascript 函数来转换字典列表

const L = 
      [ { "day": "20201210", "count": "100" } 
      , { "day": "20201211", "count": "120" } 
      , { "day": "20201212", "count":  "90" } 
      , { "day": "20201213", "count": "150" } 
      ] 

进入列表字典,如下所示:

const D = 
      { "day"   : [ "20201210", "20201211", "20201212", "20201213"] 
      , "count" : [ "100", "120", "90", "150"] 
      } 

?如果不是,在 JS 中最简单的方法是什么?

(有点类似于矩阵的“转置”操作)。

注意:这里是转置而不是像 Most efficient method to groupby on an array of objects

中的 groupby

6 个答案:

答案 0 :(得分:2)

假设所有对象都具有相同的键并且您的数组不为空,这将起作用:

let D = {};
Object.keys(L[0]).forEach(k => {
    D[k] = L.map(o => o[k]);
});

当然有更有效的解决方案,但这种方法简洁明了,而且在效率方面还不错。

答案 1 :(得分:1)

我认为不存在这样的函数,至少在普通 JavaScript 中是这样。

一个简单、纯正、清晰易懂的方法是这样的:

var L = [
    {
        "day": "20201210",
        "count": "100"
    },
    {
        "day": "20201211",
        "count": "120"
    },
    {
        "day": "20201212",
        "count": "90"
    },
    {
        "day": "20201213",
        "count": "150"
    }
];
var D = { };

for (var dict in L)
{
    for (var key in L[dict]) 
    {
        if (D[key] == null) {
            D[key] = [ ];
        }
        
        D[key].push(L[dict][key]);
    }
} 

这绝对不是最简洁或最优化的方法,尽管它会奏效。

答案 2 :(得分:1)

你可以像这样重构你的字典数组,然后用 Array.prototype.map

重新映射它

例如(以下做法需要将元素迭代 map N * X 次,其中 NL 的长度,X 是您想要的属性数量想要在 D 中拥有,忽略此,如果您有许多想要查看的属性。)

但是,这是我想在第二种方法之前向您介绍的最简单易读的方法。

const L = [{"day":"20201210","count":"100"},{"day":"20201211","count":"120"},{"day":"20201212","count":"90"},{"day":"20201213","count":"150"}];

const D = {
  'day': L.map(elem => elem['day']),
  'count': L.map(elem => elem['count']),
};

console.log(D);

我建议的另一种方法是使用 Array.prototype.reduce,这在您的情况下非常受欢迎,因为它可以通过向初始数组添加更多属性来轻松扩展。

const L = [{"day":"20201210","count":"100"},{"day":"20201211","count":"120"},{"day":"20201212","count":"90"},{"day":"20201213","count":"150"}];

const D = L.reduce((acc, cv) => {
  for (const propertyToGrab in acc) {
    if (cv.hasOwnProperty(propertyToGrab)) {
      acc[propertyToGrab].push(cv[propertyToGrab]);
    }
  }

   return acc;
}, {
  'day': [],
  'count': []
});

console.log(D);

答案 3 :(得分:1)

这里有一个相当简短且有效的通用值方法。

L.forEach(o => {
  Object.keys(o).forEach(k => {
    D[k] ||= [];
    D[k].push(o[k]);
  });
});

const L = [{
  "day": "20201210",
  "count": "100"
}, {
  "day": "20201211",
  "count": "120"
}, {
  "day": "20201212",
  "count": "90"
}, {
  "day": "20201213",
  "count": "150"
}]

let D = {};

L.forEach(o => {
  Object.keys(o).forEach(k => {
    D[k] ||= [];
    D[k].push(o[k]);
  });
});

console.log(D);

答案 4 :(得分:0)

const D={day:[], count:[]};

    for(const item of L){
    D.day.push(item.day);
    D.count.push(item.count);
    }

答案 5 :(得分:0)

 const input = [{"day":"20201210","count":"100"},{"day":"20201211","count":"120"},{"day":"20201212","count":"90"},{"day":"20201213","count":"150"}];
 // Create a variable that will store the result
 let result = {};
 // Loop through the input with forEach
 input.forEach((element) => {
     // Loop through the keys 
    for(let key in element) {
        // Check if a key is not exist in the result 
        if(!result.hasOwnProperty(key)) {
            // Then create an key and assign an empty array to it
            result[key] = [];
        }
        // Push the elemnts to the array.
        result[key].push(element[key]);
    }
 });