簡體   English   中英

有沒有一種方法可以對JavaScript數組進行重復數據刪除並合並數據值?

[英]Is there a way to de-dupe a javascript array and combine values of the data?

我正在使用ajax請求來獲取一些XML數據,然后將這些數據推入Fusioncharts中的圖表中。

XML數據的格式為[花費的時間],[完成的工作],[哪個團隊完成],[誰做的](請參見下文)。

我正在遍歷XML,然后使用以下代碼構建數組:

 //Time Recorded
                    if (columnidchecker == 7781) {
                        timearray.push($j(this).find('displayData').text());
                        temp1 = $j(this).find('displayData').text();
                    }
                    //Type of Activity
                    if (columnidchecker == 7782) {
                        activityarray.push($j(this).find('displayData').text());
                        temp2 = $j(this).find('displayData').text();
                    }
                    //Team Done For
                    if (columnidchecker == 7783) {
                        subjectarray.push($j(this).find('displayData').text());
                        temp3 = $j(this).find('displayData').text();
                    }
                    //Name
                    if (columnidchecker == 7777) {
                        internalclientarray.push($j(this).find('displayData').text());
                        temp4 = $j(this).find('userDisplayName').text();
                    }
                });
                //PUSH INTO A NEW ARRAY WHICH CAN THEN BE SORTED AND DE-DUPED WITH TIME COMBINED AGAINST ACTIVITY / TEAM.
                objectarray.push([temp1, temp2, temp3, temp4]);

這將從XML構建一個條目數組,該條目基本上輸出為如下所示的內容:

0: (4) ["1.50", "Ad-hoc queries or calls", "Team 1", "James"]
    1: (4) ["2.50", "Ad-hoc queries or calls", "Team 1", "James"]
    2: (4) ["1.00", "Advice", "Team 2", "James"]
    3: (4) ["3.50", "Meeting (External 3rd Party)", "Team 1", "James"]
    4: (4) ["1.20", "Administration", Team 2", "James"]
    5: (4) ["5.50", "Advice", "Team 1", "John"]

我正在嘗試在Fusioncharts中構建一個圖表,該圖表需要如下所示的格式(忽略腳的內容-它直接從FusionCharts幫助頁面中獲取!)。

{
    "chart": {
        "theme": "fusion",
        "caption": "Revenue split by product category",
        "subCaption": "For current year",
        "xAxisname": "Quarter",
        "yAxisName": "Revenues (In USD)",
        "showSum": "1",
        "numberPrefix": "$"
    },
    "categories": [
        {
            "category": [
                {
                    "label": "Q1"
                },
                {
                    "label": "Q2"
                },
                {
                    "label": "Q3"
                },
                {
                    "label": "Q4"
                }
            ]
        }
    ],
    "dataset": [
        {
            "seriesname": "Food Products",
            "data": [
                {
                    "value": "11000"
                },
                {
                    "value": "15000"
                },
                {
                    "value": "13500"
                },
                {
                    "value": "15000"
                }
            ]
        },
        {
            "seriesname": "Non-Food Products",
            "data": [
                {
                    "value": "11400"
                },
                {
                    "value": "14800"
                },
                {
                    "value": "8300"
                },
                {
                    "value": "11800"
                }
            ]
        }
    ]
}

我遇到的問題是我無法弄清楚如何根據時間,活動,團隊,姓名和類別將數據數組進行分類。

我認為第一步是創建一個新的名稱數組,該名稱數組可以推入Fusioncharts的“類別”數據字段中。

然后,我需要一種方法來記錄針對每個活動和每個團隊的時間,並確保在分配的條形圖中將其分配給合適的人,並結合所花費的時間。 (即“詹姆斯”總共花了4個小時為第1小組進行“臨時查詢和呼叫”,但這分為兩個時間條目,因此我需要一種將它們組合為一個的方法。)

任何幫助,將不勝感激。

我可以使用以下代碼對名稱進行重復數據刪除以創建新數組:

 namesarray.push(temp4);
 uniq = [...new Set(namesarray)];

但是之后它開始變得非常復雜。

也許這可以對您有所幫助。 它可能不完全符合您想要的形式,但是它演示了如何將問題分解為更小的部分。

偽代碼:

  1. 獲得唯一的名稱。
  2. 獲得唯一的“任務”名稱(因為缺少更好的詞)
  3. 對於每個唯一的人名:

    3.1。 獲取該人的數據行

    3.2 對於所有唯一任務名稱:

    1. 查找與任務名稱匹配的人員數據行
    2. 匯總這些數據行的持續時間

 const testData = [ [ "1.50", "Ad-hoc queries or calls", "Team 1", "James" ], [ "2.50", "Ad-hoc queries or calls", "Team 1", "James" ], [ "1.00", "Advice", "Team 2", "James" ], [ "3.50", "Meeting (External 3rd Party)", "Team 1", "James" ], [ "1.20", "Administration", "Team 2", "James" ], [ "5.50", "Advice", "Team 1", "John" ] ]; const columnIndexByName = { TASK_DURATION: 0, TASK_NAME: 1, FOR_WHICH_TEAM: 2, PERSON_DOING_TASK: 3 }; const sum = (acc, next) => acc + next; const uniqueNames = [...new Set(testData.map(row => row[columnIndexByName.PERSON_DOING_TASK])) ]; const uniqueTaskNames = [...new Set(testData.map(row => row[columnIndexByName.TASK_NAME])) ]; let result = {}; uniqueNames.forEach(personName => { const personDataRows = testData.filter(row => row[columnIndexByName.PERSON_DOING_TASK] === personName); let taskDurationsByTaskName = {}; uniqueTaskNames.forEach(taskName => { const taskRows = personDataRows.filter(row => row[columnIndexByName.TASK_NAME] === taskName); const taskDurations = taskRows.map(row => Number.parseFloat( row[columnIndexByName.TASK_DURATION] )); const taskTotalDuration = taskDurations.reduce(sum, 0); taskDurationsByTaskName[taskName] = taskTotalDuration; }) result[personName] = taskDurationsByTaskName; }) const renderData = data => document.querySelector("#output").innerHTML = JSON.stringify(data, null, 2); renderData(result); 
 <pre id="output"></pre> 

暫無
暫無

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

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