as3 组合匹配的数组元素,使用数学计算数字
as3 combine elements of array that match, use math to count the numbers
因为找不到解决问题的办法,我的脑子里一直在转。我在网上搜索过以找到完成它的答案或解决方案。我以为我想要的很容易实现,但我做不对。也许它更难或者我只是看错了。
我制作了一个 as3 项目,其中的内容将写入 .txt 文件。每天都会创建一个新文件,这个 txt 文件将保存当天所有操作的数据。
txt 文件如下所示:
79, 2-1-2015, Orange,1,4.00, 15:59:43
79, 2-1-2015, Blue,1,1.00, 15:59:43
80, 2-1-2015, Orange,1,4.00, 16:2:52
80, 2-1-2015, Black,1,1.00, 16:2:52
(actionumber, date, article, amount, cost, time)
我现在想在我的项目中读取这些数据并查找相同的文章,计算数量和成本并将其作为一行放回新文件中。例如,基于上面的txt文件:
2, Orange, 8.00
1, Blue, 1.00
1, Black, 1.00
total: 4, , 10.00
我知道我可以通过 Filestream 读写文件。
读取文件后,我将内容放入数组并将每一行拆分为不同的元素。但是,当我需要比较和计算时,我就卡住了。
我尝试使用 IndexOf 在数组中进行搜索,但我不知道下一步该怎么做。我阅读了 .concat 并看到了从数组中删除重复项的示例。但我希望基于文章的重复项(数量和成本可能会有所不同)合并计数而不是删除。我认为那是另一杯茶?!
有没有一个很好的例子或者可以指出正确的方向?非常感谢
您可以使用 Object
(或关联数组)来存储您的文章,并将它们的名称作为关键字,如下所示:
var url_request:URLRequest = new URLRequest('data.txt')
var url_loader:URLLoader = new URLLoader()
url_loader.addEventListener(
Event.COMPLETE,
function(e:Event){
load_data(e.target.data);
}
)
url_loader.load(url_request);
function load_data(data:String):void {
var actions:Object = {};
// convert all data to an Array
var temp_arr:Array = data.split(String.fromCharCode(13));
for(var i = 0; i < temp_arr.length; i++){
var action_line:String = temp_arr[i];
// convert every line to an Array
var action_arr:Array = action_line.split(', ');
var article:String = action_arr[2];
var amount:int = action_arr[3];
var cost:int = action_arr[4];
if(actions[article]){
var t_a:Array = actions[article]
t_a[0] += int(amount); // cumulate amount
t_a[2] += int(cost); // cumulate cost
// update article
actions[article] = t_a;
// example : actions['Orange'] = [1, 'Orange', 4]
// => actions['Orange'] = [2, 'Orange', 8]
} else {
// create new article as an Array
actions[article] = [int(amount), article, int(cost)];
// example : actions['Orange'] = [1, 'Orange', 4]
}
}
var amounts:int = 0;
var costs:int = 0;
for(var action:String in actions){
amounts += actions[action][0];
costs += actions[action][2];
trace(actions[action][0]+', '+actions[action][1]+', '+actions[action][2].toFixed(2));
}
trace('total : '+amounts+', '+costs.toFixed(2));
// gives :
//
// 1, Black, 1.00
// 2, Orange, 8.00
// 1, Blue, 1.00
// total : 4, 10.00
}
当然你必须添加将这些数据保存到文本文件中的部分。
希望对您有所帮助。
因为找不到解决问题的办法,我的脑子里一直在转。我在网上搜索过以找到完成它的答案或解决方案。我以为我想要的很容易实现,但我做不对。也许它更难或者我只是看错了。
我制作了一个 as3 项目,其中的内容将写入 .txt 文件。每天都会创建一个新文件,这个 txt 文件将保存当天所有操作的数据。
txt 文件如下所示:
79, 2-1-2015, Orange,1,4.00, 15:59:43
79, 2-1-2015, Blue,1,1.00, 15:59:43
80, 2-1-2015, Orange,1,4.00, 16:2:52
80, 2-1-2015, Black,1,1.00, 16:2:52
(actionumber, date, article, amount, cost, time)
我现在想在我的项目中读取这些数据并查找相同的文章,计算数量和成本并将其作为一行放回新文件中。例如,基于上面的txt文件:
2, Orange, 8.00
1, Blue, 1.00
1, Black, 1.00
total: 4, , 10.00
我知道我可以通过 Filestream 读写文件。 读取文件后,我将内容放入数组并将每一行拆分为不同的元素。但是,当我需要比较和计算时,我就卡住了。
我尝试使用 IndexOf 在数组中进行搜索,但我不知道下一步该怎么做。我阅读了 .concat 并看到了从数组中删除重复项的示例。但我希望基于文章的重复项(数量和成本可能会有所不同)合并计数而不是删除。我认为那是另一杯茶?!
有没有一个很好的例子或者可以指出正确的方向?非常感谢
您可以使用 Object
(或关联数组)来存储您的文章,并将它们的名称作为关键字,如下所示:
var url_request:URLRequest = new URLRequest('data.txt')
var url_loader:URLLoader = new URLLoader()
url_loader.addEventListener(
Event.COMPLETE,
function(e:Event){
load_data(e.target.data);
}
)
url_loader.load(url_request);
function load_data(data:String):void {
var actions:Object = {};
// convert all data to an Array
var temp_arr:Array = data.split(String.fromCharCode(13));
for(var i = 0; i < temp_arr.length; i++){
var action_line:String = temp_arr[i];
// convert every line to an Array
var action_arr:Array = action_line.split(', ');
var article:String = action_arr[2];
var amount:int = action_arr[3];
var cost:int = action_arr[4];
if(actions[article]){
var t_a:Array = actions[article]
t_a[0] += int(amount); // cumulate amount
t_a[2] += int(cost); // cumulate cost
// update article
actions[article] = t_a;
// example : actions['Orange'] = [1, 'Orange', 4]
// => actions['Orange'] = [2, 'Orange', 8]
} else {
// create new article as an Array
actions[article] = [int(amount), article, int(cost)];
// example : actions['Orange'] = [1, 'Orange', 4]
}
}
var amounts:int = 0;
var costs:int = 0;
for(var action:String in actions){
amounts += actions[action][0];
costs += actions[action][2];
trace(actions[action][0]+', '+actions[action][1]+', '+actions[action][2].toFixed(2));
}
trace('total : '+amounts+', '+costs.toFixed(2));
// gives :
//
// 1, Black, 1.00
// 2, Orange, 8.00
// 1, Blue, 1.00
// total : 4, 10.00
}
当然你必须添加将这些数据保存到文本文件中的部分。
希望对您有所帮助。