【问题标题】:Is there a way to de-dupe a javascript array and combine values of the data?有没有办法对 javascript 数组进行重复数据删除并组合数据的值?
【发布时间】:2019-07-09 13:47:28
【问题描述】:

我正在使用 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)];

但在那之后它开始变得相当复杂。

【问题讨论】:

  • 我很难想象输出数据的外观。您可以修改食物示例以适合您的数据吗?在您的情况下,“类别”和“系列名称”是什么?

标签: javascript jquery arrays


【解决方案1】:

也许这可以帮助您一路走来。它可能并不完全符合您想要的形式,但它演示了如何将问题分解为更小的部分。

伪代码:

  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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多