簡體   English   中英

從lodash中的map()返回對象數組上groupBy()的結果將導致[object]

[英]Returning results of groupBy() on an array of objects from a map() in lodash results in [object]

我正在嘗試對對象數組執行兩個groupBy( 本質上,我正在嘗試鏈接兩個groupBy)

let lodash = require('lodash');
var characters = [
  { 'name': 'barney', 'age': 42,  'pet': 'dog' },
  { 'name': 'fred',   'age': 35,  'pet': 'dog' },
  { 'name': 'barney', 'age': 42,  'pet': 'cat' },
  { 'name': 'fred',   'age': 35,  'pet': 'goldfish' }
];

var groupByAge = lodash.groupBy(characters, 'age');

//console.log(groupByAge);

var groupByAgeAndPet = lodash.map(groupByAge, function(value){
  return lodash.groupBy(value, 'pet');

});

console.log(groupByAgeAndPet);

但是,輸出為:

[{狗:[[對象]],金魚:[[對象]]},{狗:[[對象]],貓:[[對象]]}]

如果在地圖中執行console.log(),我將得到想要的結果。

我應該使用什么代替lodash.map()還是需要做一些處理才能從地圖返回。

repl.it鏈接到代碼: https ://repl.it/@Kun_XinXin/OptimalUnkemptTrapezoids

這是預期的回報:

{
   35: { dog: [ { name: 'barney', age: 42, pet: 'dog' } ],
  cat: [ { name: 'barney', age: 42, pet: 'cat' } ] },
   42:{ dog: [ { name: 'fred', age: 35, pet: 'dog' } ],
  goldfish: [ { name: 'fred', age: 35, pet: 'goldfish' } ] }
}

使用原生javascript和array reduce函數可以實現相同的輸出。創建一個函數並傳遞一個參數,通過該參數可以對對象進行分組。 例如,在下面的函數中,您可以傳遞nameagepet以便按此鍵名稱對對象進行分組。

 var characters = [{ 'name': 'barney', 'age': 42, 'pet': 'dog' }, { 'name': 'fred', 'age': 35, 'pet': 'dog' }, { 'name': 'barney', 'age': 42, 'pet': 'cat' }, { 'name': 'fred', 'age': 35, 'pet': 'goldfish' } ]; // creating a function which accepts an parameter which will be used to // group the objects function groupBy(keyName) { return characters.reduce(function(acc, curr, currIndex) { // checking if the object have any key by which the object will be grouped if (!acc.hasOwnProperty(curr[keyName])) { // if not create a key acc[curr[keyName]] = []; acc[curr[keyName]].push(curr) } // else just push the value acc[curr[keyName]].push(curr); return acc; }, {}) } // replace pet with name or age to group result by that key console.log(groupBy('pet')) 

如果有人在使用console.log調試此類情況時遇到此問題,則它實際上可以正常工作; 只是某種程度上,包含在其中的對象被縮短為[object]

如果您使用console.log直接訪問該對象,則它確實起作用。

let lodash = require('lodash');
var characters = [
  { 'name': 'barney', 'age': 42,  'pet': 'dog' },
  { 'name': 'fred',   'age': 35,  'pet': 'dog' },
  { 'name': 'barney', 'age': 42,  'pet': 'cat' },
  { 'name': 'fred',   'age': 35,  'pet': 'goldfish' }
];

var groupByAge = lodash.groupBy(characters, 'age');

//console.log(groupByAge);

var groupByAgeAndPet = lodash.mapValues(groupByAge, function(value){
  return lodash.groupBy(value, 'pet');

});

// this will display the actual object instead of the string 
console.log(groupByAgeAndPet[35]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM