2017-01-11 5 views
0

私は非常に複雑な計算を手にしています。ここにあります。私は3つのテーブルを持っています。他のテーブルの列と比較して列データをインクリメントする

表1:(ID1と和は、テーブルの列です)

ID1 | Sum 
123456 | 
345678 | 

表2:(市、ID2は、テーブルの列です)

City | ID2  
NY | 123456   
CA | 345678   
TX | 12345   
BF | 34567 

表3:(市、ID3テーブルの列です)

City | ID3 
LA | 123456 
NB | 12345 

表1の最終出力は次のとおりです。

表2と表3の値に応じて、表1には、私は最初のシナリオを説明します。この

ID1 | Sum 
123456 | 4 
345678 | 2 

のようになります。私は 'Table1'の '合計'列を更新したいと思います。これは、 'Table1'の列 'ID1'の最初の5文字と 'Table2'の 'ID2'列と 'Table3'の 'ID3'列に存在する列データの最初の5文字とを比較することによって更新される。

Table1の '12345'(実際の値が '123456'であることに注目)をTable2とTable3の列データと比較します。 (表2及び表3は、入力の同様の形態である)

[Object][Object] 
[0-1] 
    [0]: Object 
     ID1: '123456' 
     Sum: 
    [1]: Object 
     ID1: '345678' 
     Sum: 

ソリューション - :従って合計は次の形式 表1にあるテーブルに最終表1

入力で4であることが出てきます試みた:

function count(key) { 
return function (r, a) { 
    r[a[key]] = (r[a[key]] || 0) + 1; 
    return r; 
}; 
} 

Table1.forEach(function (a) { 
a.Sum = this[a.ID1] || '-'; 
}, Table2.reduce(count('ID2'), Table3.reduce(count('ID3'), Object.create(null)))); 

上記の解決策は、ID1とID2とID3の値をそのまま比較します。私はデータの最初の5文字だけを使用して、上記のように比較したいと思います。誰かが私の問題を解決するためにコードをどのように編集する必要があるかを教えてもらえますか?

答えて

0

あり、おそらくこれよりも良い方法です...一つのオプションは、私たちは知ってみましょう

var table1=[{id:'123456',sum:0},{id:'345678',sum:0},{id:'345',sum:0}]; 
 
var tables = {"table2":[{id1:'12345'},{id1:'12345'},{id1:'1234567'},{id1:'345'},{id1:'34567'},{id1:'3'}],"table3":[{id1:'12345'},{id1:'12345'},{id1:'1234567'},{id1:'34567'},{id1:'3'}],"table4":[],"table5":null,"table6":"","table7":[{id1:'12345'},{id1:'12345'},{id1:'1234567'},{id1:'34567'},{id1:'3'}]}; 
 

 
//foreach key/value in the table1 object 
 
_.each(table1, function(a, b) { 
 
    var current = a.id; 
 
    a.sum = 0; 
 
    //foreach key/value in the tables 
 
    _.each(tables, function(c, d) {  
 
    //add check, expand this as required 
 
    if (c != undefined && c instanceof Array) { 
 
     a.sum += findTotal(c, current); 
 
    } 
 
    }); 
 
}); 
 

 
function findTotal(tableToWork, currentId) { 
 
    var sum = _.countBy(tableToWork, function(e, f) { 
 
    return e.id1.substring(0, 4) == currentId.substring(0, 4) 
 
    }); 
 
    return sum.true == null ? 0 : sum.true; 
 
} 
 
document.getElementById('p').innerHTML = JSON.stringify(table1)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 
 
<p id="p"> 
 
    Hi 
 
</p>

です。

+0

のみ2のテーブルがある場合こんにちは、これは解決策です。最初のテーブルが他の2つのテーブルに基づいて更新されている場合、ワット? – Rihana

+0

@Rihana、あなたのコメントに基づいてコードを更新しました。それはあなたが尋ねたものなら私は確信していません。 – Searching

+0

@ Searching-これは動作します。今私はこの答えを受け入れる前に、最後の質問が1つあります。テーブル2とテーブル3のどちらかが未定義で、テーブル2とテーブル3の両方が未定義の場合はどうなりますか? – Rihana

0

あなたは1 aggTableを持っているし、次のようにソース表とその関連のid列の配列srcTables、一般的な解決策が可能と仮定:

var aggTable = Table1; 
var srcTables = [{ table: Table2, id: 'ID2' }, { table: Table3, id: 'ID3' }]; // can add as many as needed 

// returns the key portion of the ID 
function getKey(id) { 
    return id.substring(0, 4); 
} 

// count IDs inside one source table 
function countIDs(table, id) { 
    return _.countBy(table, function(row) { return getKey(row[id]); }); 
} 

function aggregate(aggTable, srcTables) { 
    // yields the following result: [{ 12345: 2, 34567: 2 }, { 12345: 2 }] 
    var idCounts = _.map(srcTables, function(entry) { return countIDs(entry.table, entry.id) }); 

    // aggregate counts into the aggTable 
    _.each(aggTable, function(row) { 
    var id = getKey(row['ID1']); 
    row['Sum'] = _.reduce(idCounts, function(memo, idCount) { 
         return (_.has(idCount, id)) ? memo + idCount[id] : memo; 
        }, 0); 
    }); 
} 
関連する問題