簡體   English   中英

如何使用javascript對第二個數組中的屬性進行分組

[英]How to groupBy an attribute inside the second array with javascript

我正在嘗試將一個數組對象轉換為一組按其值分組的新數組。 在這種情況下,它是日期值。 我在下面的代碼中嘗試過,但沒有得到我想要的結果。 你能幫我找到這個問題的正確解決方案嗎?

輸入

let array = [
    { 
        "category": {
        "code": "1558950145861"},
        "lines": [
            {
                "date": "2020-02-26",
                "price": 9260,
                "dispo": 5
            },
            {
                "date": "2020-02-29",
                "price": 6300,
                "dispo": 9
            },
            {
                "date": "2020-04-01",
                "price": 7700,
                "dispo": 23
            }
        ]
     },
     {
         "category": {
             "code": "1788858954441"
         },
         "lines": [
             {
                 "date": "2020-02-26",
                 "price": 6260,
                 "dispo": 2
             },
             {
                 "date": "2020-02-29",
                 "price": 5500,
                 "dispo": 4
             },
             {
                 "date": "2020-04-01",
                 "price": 840,
                 "dispo": 7
             }
         ]
     }
];

期望輸出

[{
   "date": "2020-02-26",
   "lines": [{
        "price": 9260,
        "dispo": 5
    }, {
        "price": 6260,
        "dispo": 2
    }]
    }, {
        "date": "2020-02-29",
        "lines": [{
            "price": 6300,
            "dispo": 9
        }, {
            "price": 5500,
            "dispo": 4
        }]
    }, {
        "date": "2020-04-01",
        "lines": [{
            "price": 7700,
            "dispo": 23
        }, {
            "price": 840,
            "dispo": 7
        }]
    }]

我寫的代碼

var result = (_array)
    .groupBy(x => {
          for (let j = 0; j < x.lines.length; j += 1) {
          return x.lines[j].date;
        }
    })
    .map((value, key) => ({
      date: key,
      lines: value
    })).value();

我希望我的代碼生成所需的輸出,但它沒有這樣做。 我可能做錯了什么?

嘗試這個

 let array = [{ "category": { "code": "1558950145861" }, "lines": [{ "date": "2020-02-26", "price": 9260, "dispo": 5 }, { "date": "2020-02-29", "price": 6300, "dispo": 9 }, { "date": "2020-04-01", "price": 7700, "dispo": 23 }] }, { "category": { "code": "1788858954441" }, "lines": [{ "date": "2020-02-26", "price": 6260, "dispo": 2 }, { "date": "2020-02-29", "price": 5500, "dispo": 4 }, { "date": "2020-04-01", "price": 840, "dispo": 7 }] }] const groupBy = (arr) => arr.reduce((acc, ele)=>( (acc[ele.date] = acc[ele.date] || []).push(ele), acc),{}) const all = [].concat(...array.map(ele=> ele.lines)) const format = ele => ele.map(({price, dispo})=>({price, dispo})) console.log(Object.entries(groupBy(all)).map(([date, lines])=> ({date, lines: format(lines)})))

嘗試這樣的事情:

var out = {}
for (let i = 0; i < array.length; i++) {
  for (let j = 0; j < array[i]["lines"].length; j++) {
    let e = array[i]["lines"][j];
    if (!out[e["date"]]) {
      out[e["date"]] = [];
    }
    out[e["date"]].push({"price": e["price"], "dispo": e["dispo"]});
  }
}

var result = [];
for (let k in out) {
  result.push({"date": k, "lines": out[k]});
}

result變量具有所需的輸出格式。

您似乎不需要category值,所以首先我將這些行合並到一個數組中,您可以從那里 groupBy :

// using your input called 'array'

// First collect just the line arrays:
var arrayOfLineArrays=array.map(category => category.lines);

// Merge them into one bigger array:
var allLines = _.flatten(arrayOfLineArrays);

// Now you can groupBy with ease:
var dateGroupsObject = _(allLines).groupBy(line => line.date);

// And map to an array:
var result = _.values(_.mapObject(dateGroupsObject, (value, key) => ({
     date: key,
     lines: value
}))));

暫無
暫無

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

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