下面的代码是一个统计inputs数组中的重复元素的方法,现在老师让我将该方法拆解成两个方法来实现,最好是将第二个for循环拆解成一个方法
var inputs=[
{barcode: 'ITEM000000',name: '可口可乐',unit: '瓶',price: 3.00},
{barcode: 'ITEM000000',name: '可口可乐',unit: '瓶',price: 3.00},
{barcode: 'ITEM000000',name: '可口可乐',unit: '瓶',price: 3.00},
{barcode: 'ITEM000000',name: '可口可乐',unit: '瓶', price: 3.00},
{barcode: 'ITEM000000',name: '可口可乐',unit: '瓶',price: 3.00},
{barcode: 'ITEM000001',name: '雪碧',unit: '瓶',price: 3.00},
{barcode: 'ITEM000004',name: '电池',unit: '个',price: 2.00} ,
{barcode: 'ITEM000001',name: '雪碧',unit: '瓶',price: 3.00},];
function get_list(inputs){
var items=[];
items.push(inputs[0]);
items[0].count=0;
for(var i=0;i<inputs.length;i++){
for(var j=0;j<items.length;j++){
if(inputs[i].barcode==items[j].barcode){
items[j].count++;
break;
}
else if(j==items.length-1){
inputs[i].count=1;
items.push(inputs[i]);
break;
}
}
}
return items;
}
function get_list2(inputs){
var items=[];
for(var i=0;i<inputs.length;i++){
var item=inputs[i];
var key=item.barcode+"_"+item.name+"_"+item.unit+"_"+item.price;
if(items[key]){
items[key].count++;
}
else{
items[key]={count:1,data:item};
}
}
console.log(items);
}
//改成下面这种写法吧,这样每次过滤,inputs中的重复行会动态删减,减少最外层遍历次数
function get_list(inputs){
var items=[];
for(var i=0;i<inputs.length;i++){
i=getRepeat(i,inputs,items)?i-1:i;
}
return items;
}
function getRepeat(index,inputs,items){
for(var i=0;i<items.length;i++){
if(inputs[index].barcode==items[i].barcode){
items[i].count++;
inputs.splice(index,1);
return true;
}
}
items.push(inputs[index]);
items[items.length-1].count=1;
return false;
}
console.log(items);结果输出如下图:
alert(JSON.stringify(items));结果输出如下图:
张大教主代码写的6啊,减少最外层遍历次数 这个执行次数是不变的都是inputs.length
//仔细kanle下,上面那种写法对提高效率没起到实际作用,还是按部就班来吧
function get_list(inputs){
var items=[];//用于存储返回结果
for(var i=0;i<inputs.length;i++){
//判断inputs[i]是否已经包含在items中
//如果已经包含,items指定行count数加1,如果不包含,加入并更新count
getRepeat(inputs[i],items);
}
alert(JSON.stringify(items));
return items;
}
//getRepeat用于判断input是否已经包含在items中
//true:已经包含,items[i]记录数+1
//false:未曾包含,加入到items,更新记录数为1
function getRepeat(input,items){
for(var i=0;i<items.length;i++){
if(input.barcode==items[i].barcode){
items[i].count++;//items包含该元素,items[i]记录数+1
return;//返回
}
}
//items尚未包含该元素
items.push(input);//加入
items[items.length-1].count=1;//记录数+1
return;//返回
}