簡體   English   中英

JavaScript ES6:對象數組到按鍵分組並按屬性索引的數組

[英]JavaScript ES6: array of objects to array grouped by key and indexed by property

我有一個對象數組。 簡化版(只有幾個屬性):

let d = [
{ team:"sales", key:"employees", value:24 },
{ team:"sales", key:"floor", value:2 },
{ team:"finance", key:"employees", value:7 },
{ team:"finance", key:"floor", value:2 },
]

想要按team然后按key分組,使用純(ES6)JavaScript:

{
  sales: {
    employees: { team:"sales", key:"employees", value:24 },
    floor: { team:"sales", key:"floor", value:2 }
  },
  finance: {
    employees: { team:"finance", key:"employees", value:7 },
    floor: { team:"finance", key:"floor", value:2 }
  }
}

有點類似於其他問題,但不完全相同。

到目前為止我所擁有的:使用reduce按team分組:

let groupBy = (data, field) => data.reduce((acc, obj) => Object.assign(acc, { [obj[field]]:( acc[obj[field]] || [] ).concat(obj) }), {})

let result = groupBy(d,'team')

這給出:

{
sales: [
  { team:"sales", key:"employees", value:24 },
  { team:"sales", key:"floor", value:2 }
],
finance: [
  { team:"finance", key:"employees", value:7 },
  { team:"finance", key:"floor", value:2 }
]
}

不確定推薦的方法是按團隊內部的key級別分組。

不是通過將每個對象連接到一個新數組來累積到一個數組,您可以累積到一個新的對象文字。 您可以通過將累積的對象擴展為新的對象字面量來實現此目的。 然后,同樣,您可以為當前對象團隊傳播累積對象的結果,或者如果不存在則采用默認對象 ( || {} )。 最后,您可以在obj.key嵌套對象文字上設置一個新鍵,並將其值設置為當前迭代對象本身。

 const data = [ { team:"sales", key:"employees", value:24 }, { team:"sales", key:"floor", value:2 }, { team:"finance", key:"employees", value:7 }, { team:"finance", key:"floor", value:2 }, ]; const groupBy = (array, field) => array.reduce((acc, obj) => ({...acc, [obj[field]]: {...(acc[obj[field]] || {}), [obj.key]: obj}}), {}); console.log(groupBy(data,'team'));

您可以通過檢查和添加新對象來獲取用於分組和減少對象的鍵數組,或者對於最后一個鍵從數據中獲取對象。

 let d = [{ team: "sales", key: "employees", value: 24 }, { team: "sales", key:" floor", value: 2 }, { team: "finance", key: "employees", value: 7 }, { team: "finance", key: "floor", value: 2 }], groups = ['team', 'key'], result = d.reduce((acc, obj) => { groups.reduce((o, key, i, { length }) => { const k = obj[key]; return o[k] = o[k] || (i + 1 === length ? obj : {}); }, acc); return acc; }, {}); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

您可以使用減少

 let d = [{ team:"sales", key:"employees", value:24 },{ team:"sales", key:"floor", value:2 },{ team:"finance", key:"employees", value:7 },{ team:"finance", key:"floor", value:2 },] let groupBy = (data, property) => data.reduce((op, inp) => { let prop = inp[property] let key = inp.key op[prop] = op[prop] || {} op[prop][key] = op[prop][key] || {} op[prop][key] = inp return op }, {}) console.log(groupBy(d, 'team'))

暫無
暫無

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

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