Javascript 如何计算多维数组的值
我有一个大字符串数组,如:Javascript 如何计算多维数组的值,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,我有一个大字符串数组,如: var array = [["worker ", "department", "2", "6", "8", "3", "1", "12", ... , 14] ["1", "Duty/Not", "1", "0", "1", "0", "0", "1", ..., "0"] ["worker ", "department", "11", "10", "11", "3", ..., "7"] ["2
var array = [["worker ", "department", "2", "6", "8", "3", "1", "12", ... , 14]
["1", "Duty/Not", "1", "0", "1", "0", "0", "1", ..., "0"]
["worker ", "department", "11", "10", "11", "3", ..., "7"]
["2", "Duty/Not", "0", "1", "1", "1", "1", "1", ..., "1"]];
在这个数组中,数组行的每个数组都有15000个元素,并且前两个子数组和其他子数组之间存在关系。例如,第一行包含第一个员工所在的部门。否则,第二行包含第一个工人的职责,或不使用1或0表示
我想计算员工被分配到哪个部门的次数。
我试着用循环数数。然而,这需要很长时间
编辑:
我实现的一部分
//Reading and parsing from csv file
d3.text("worker.csv", function(text) {
var data = d3.csvParseRows(text).map(function(row) {
return row.map(function(string) {
return string;
});
});
//Concatination
var concatArray = [].concat(...data);
//console.log(concatArray);
//从数组中删除NULL
var filteredAry=concatArray.filter(函数(e){returne!=“”});
控制台日志(filteredAry)代码>
现在,我的问题几乎和以前一样。我想将部门ID映射到每个员工的分配次数。例如,预期输出如下
输出=(1,0),(2,3),(3,1),(4,2),(5,0),(6,1).
我不太清楚您在这里想要实现什么,但这里有几个问题需要您思考:
你介意分享你的代码吗,这样我们就可以更好地了解你在这里想要实现什么
您在哪里检索此数据?您是按原样提供此二维阵列还是创建了它?如果您是生成阵列的人,那么优化阵列的一种方法是使用不同的数据结构。如果按原样提供数组,则必须至少循环一次所有元素(即15000个条目/行*行数
),以将其转换为不同的数据结构
你想数到多少次?这是一次性的还是重复的任务?如果这是一个重复的任务,我建议缓存最终的数据结构,或者将其视为一个全局值,这样您就不必每次都需要计算计数
我解决了这个问题
解决方案:
var count = [], i, value, total = 0;
for (i = 0; i < array.length; i++) {
value = array[i];
if (typeof count[value] === "undefined") {
count[value] = 1;
} else {
count[value]++;
}
}
var count=[],i,value,total=0;
对于(i=0;i
这已经解决了,但是对于您的原始问题,应该有一个更快的解决方案,那就是:
//测试数据
风险值数据=[“工人”、“部门”、“2”、“6”、“8”、“3”、“1”、“12”、11],
[“1”、“职责/非”、“1”、“0”、“1”、“0”、“0”、“1”、“0”],
[“工人”、“部门”、“11”、“10”、“11”、“3”、“2”、“3”、“11],
[“2”、“职责/非”、“0”、“1”、“1”、“1”、“1”、“1”、“1”];
//我们需要提前知道部门的数量,以便加快速度
const numOfDepartments=12;
//首先,这些部门没有工人
让countForEachDepartment=数组(numOfDepartments)。填充(0);
让我们参考世界其他地区的部门;
//检查每一行
data.forEach((行,索引)=>{
//始终删除前两列,因为它们是无用的
row.shift();
row.shift();
//我们是单数还是偶数?
如果(索引%2){
//偶数行:我们计算数字
row.forEach((列,索引)=>{
//数组从1开始,我们将字符串转换为一个带-0的数字,只需将其相加
countForEachDepartment[参考部门行[索引]-1]+=(列-0);
})
}否则{
//奇数行:我们有将用作偶数行参考的部门的编号
referrenceToDepartmentsInRow=行;
}
});
控制台日志(countForEachDepartment)代码>此结构错误,应使用数组和对象的组合。在复杂的数组中没有任何“奇特”的计数方法。因此一个工作者必须有两行记录?我编辑了问题@SphinxI编辑了问题@akxe示例数组不是有效的javascript。至少提供一个有效的起点。人们似乎想帮助你,但你没有尽到自己的责任:1。我编辑了问题并分享了我的代码。2.我认为添加信息就足以回答这些问题@Jay@Y.E.S.你能分享你用来计算员工人数的循环吗?我不确定我是否正确理解了这个问题——它相当模糊。您希望您的输出是什么?这些员工ID和部门ID是作为输入提供的,以便您知道要计算什么,还是要计算所有内容(即,对于每个员工,将部门ID映射到分配给他们的次数),我想数一数每个员工被分配到哪个部门的次数。谢谢您的回答@Markus Madeja
["worker", "1"]
["depermant", "Duty/Not"]
["2", "1"]
["2", "1"]
["8", "1"]
["3", "0"]
["1", "0"]
["12", "1"]
["10", "1"]
["5", "0"]
["14", "1"]
["4", "1"]
["2", "1"]
["4", "1"]
["6", "1"]
["6", "0"]
["6", "0"]
["3", "1"]
var count = [], i, value, total = 0;
for (i = 0; i < array.length; i++) {
value = array[i];
if (typeof count[value] === "undefined") {
count[value] = 1;
} else {
count[value]++;
}
}