2017-03-03 8 views
1

これに似た質問に対する多くの回答が見つかりましたが、実際には何も頭に当たっていません。配列から重複オブジェクトを削除する方法を知っておく必要がありますが、それらを削除する前に元のオブジェクトにその属性の一部を追加する必要があります.jQueryではなく、通常のJavaScriptでこれを行う必要があります。たとえば、私がファーストフード店を経営する場合、売ったハンバーガーの数を知りたい。配列内の重複したオブジェクトを削除しますが、javascriptにいくつかのプロパティを追加してください。

burger[i] = new Food(i, name, price, tax); 

私が販売ひとつひとつのとてつもない大ぼらを確認する必要はありませんので、私は配列からの名前を持つすべてが、1つのオブジェクトを削除したい:販売すべてのバーガーは、このような配列という名前のバーガーに食品オブジェクトでありますおまけburger[i].nameしかし、私はまだ私が売った総額と税金を知りたいので、価格と税金を追加したいと思います。さて、私はハンバーガー以上のものを販売していると想像してください。私の最終目標は個々の食べ物を列挙するテーブルであり、総価格と税金です。

私は配列からオブジェクトを削除することを見てきたすべての例は、別のオブジェクトに最初に個々の属性を追加することなく、オブジェクトを削除するようです。前もってありがとうございます。これが混乱したり重複している場合はお詫び申し上げますが、私はこの2時間の答えを探しています。

//object constructor for groups 
function customGroup(id, name, count, attend, tax, sold, origID) { 
    this.ID = id; 
    this.cNAME = name; 
    this.cCOUNT = count; 
    this.cATT = attend; 
    this.cTAX = tax; 
    this.cSOLD = sold; 
    this.cID = origID; 
}//Ends function 

をコードは二回、このコードを使用して、これらの2つのオブジェクトの配列を作成します(私は、一度ここで配列を、それを入れている:ここで @mwilson

@RayfenWindspearは、私が使用しているオブジェクトのコンストラクタです明らかに別の名前を持っています)。

//loop to create objects from all groups in table 
     for (var i = 0; i < iName.length; i++) { 
      name = iName[i].innerHTML; 
      count = parseInt(iCount[i].innerHTML); 
      //count = Number(count.replace(/[^0-9\.-]+/g,"")); 
      attend = parseInt(iAttend[i].innerHTML);    
      tax = iTax[i].innerHTML;    
      tax = Number(tax.replace(/[^0-9\.-]+/g,"")); 
      sold = iSold[i].innerHTML; 
      sold = Number(sold.replace(/[^0-9\.-]+/g,"")); 
      id = iID[i].innerHTML; 
      tableNames[i] = new customGroup(i, name, count, attend, tax, sold, id);    
     }//ends for loop 

次に、2つのテーブルを比較し、一致するオブジェクトの配列を作成します。

for (var i=0; i < tableNames.length; i++){ 
      for(var j=0; j < otherTableNames.length; j++){ 
       if (tableNames[i].cNAME == otherTableNames[j].cNAME){     
        count = tableNames[i].cCOUNT + otherTableNames[j].cCOUNT; 
        attend = tableNames[i].cATT + otherTableNames[j].cATT; 
        tax = tableNames[i].cTAX + otherTableNames[j].cTAX; 
        sold = tableNames[i].cSOLD + otherTableNames[j].cSOLD; 
        temp = new customGroup(j, tableNames[i].cNAME, count,  attend, tax, sold, tableNames[i].cID);     
        namematch.push(temp); 
       }//ends if statement 
      }//ends nested loop 
     }//ends loop 

ここでは、同じ名前のアイテムを削除しようとしていたが、元の値をそのまま残していた。あなたがしたいかもしれないもの

//remove duplicate objects from namematch array 
      for (var i = 0, len = namematch.length; i < len; i++) { 
       for (var j = 0, len = namematch.length; j < len2; j++) {      
        if (namematch[i].cNAME === namematch[j].cNAME) {       
         if (i != j){ 
         namematch[i].cCOUNT = namematch[i].cCOUNT + namematch[j].cCOUNT; 
         namematch[i].cATT = namematch[i].cATT + namematch[j].cATT; 
         namematch[i].cTAX = namematch[i].cTAX + namematch[j].cTAX; 
         namematch[i].cSOLD = namematch[i].cSOLD + namematch[j].cSOLD;     
         namematch.splice(j, 1); 
         len2=namematch.length; 
         }//ends if statement 
        }//endsif statement 
       }//ends Nested loop 
      }//ends forloop 
+0

あなたが遭遇するどんなオブジェクトの種類前もって知っていますか、またはそれはあなたのコントロールの外にありますか? – RayfenWindspear

+0

コードを貼り付けて、より迅速で正確な回答を得ることができます。 – mwilson

答えて

0

オブジェクトを使用して単一の値をグループ化し、必要に応じて単一の配列をレンダリングできます。

function Food(i, name, price, tax) { 
 
    this.i = i; 
 
    this.name = name; 
 
    this.price = price; 
 
    this.tax = tax; 
 
} 
 

 
var burger = [ 
 
     new Food(0, 'Hamburger', 2, 0.4), 
 
     new Food(1, 'Cheeseburger', 2.5, 0.5), 
 
     new Food(2, 'Hamburger', 2, 0.4), 
 
     new Food(3, 'Cheeseburger', 2.5, 0.5), 
 
     new Food(4, 'Hamburger', 2, 0.4), 
 
     new Food(5, 'Cheeseburger', 2.5, 0.5), 
 
     new Food(6, 'Cheeseburger', 2.5, 0.5), 
 
     new Food(7, 'Hamburger', 2, 0.4), 
 
    ], 
 
    grouped = Object.create(null), 
 
    result; 
 

 
burger.forEach(function (food) { 
 
    grouped[food.name] = grouped[food.name] || { name: food.name, count: 0, price: 0, tax: 0 }; 
 
    grouped[food.name].count++; 
 
    grouped[food.name].price += food.price; 
 
    grouped[food.name].tax += food.tax; 
 
}); 
 

 
result = Object.keys(grouped).map(function (k) { return grouped[k]; }); 
 
console.log(grouped); 
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

ありがとうございます、これは私の状況に最適です! –

1

は1つだけのエントリにごburger配列、同じ名前のハンバーガー用.filter(fn)、その後、.reduce(fn)を取ること、です。

0

ユニークなアイテムを保持し、forループの配列を反復するために地図を使用します。アイテムがマップにない場合はアイテムを追加します。既存のアイテムにマップを追加します。完了したらマップの値を配列に戻します。

var items = [ 
 
    { type : "food1",sold : 2}, 
 
    { type : "food3",sold : 1}, 
 
    { type : "food2",sold : 3}, 
 
    { type : "food1",sold : 5}, 
 
    { type : "food3",sold : 1}, 
 
    { type : "food2",sold : 3}, 
 
    { type : "food1",sold : 5}, 
 
] 
 
// reduce the array into a Map 
 
var reduced = new Map(); 
 
items.forEach(item=>{ // for each item 
 
    var red = reduced.get(item.type); // get the mapped item by the item type 
 
    if(red !== undefined){ // is it defined 
 
     red.sold += item.sold; // yes add to the total 
 
    }else{ 
 
     reduced.set(item.type,item); // no then add to the map 
 
    } 
 
}) 
 
items.length = 0; // empty the old array 
 
items.push(...reduced.values()); // add the reduced items 
 
console.log(items); // show result

関連する問題