2017-01-11 2 views
0

У меня очень сложный расчет, и мне трудно пройти его. Вот. У меня 3 таблицы.Увеличение данных столбцов по сравнению с столбцами из другой таблицы

Table1: (ID1 и Sum являются столбцы таблицы)

ID1 | Sum 
123456 | 
345678 | 

Table2: (Город, ID2 являются столбцы таблицы)

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

Таблица3: (Город, ID3 столбцы таблицы)

City | ID3 
LA | 123456 
NB | 12345 

Окончательный ВЫВОД таблицы 1 должен быть следующим.

В зависимости от значений Table2 и Table3, Table1 должен выглядеть следующим образом

ID1 | Sum 
123456 | 4 
345678 | 2 

Я объясню сценарий первого. Я хочу обновить столбец «Сумма» таблицы 1. Это будет обновлено путем сравнения первых 5 символов столбца «ID1» таблицы «1» с первыми пятью символами данных столбца, присутствующими в столбце «ID2» столбца «Таблица 2» и «ID3» в таблице «Таблица 3»

, например. «12345» таблицы 1 (обратите внимание, что фактическое значение «123456») сравнивается с данными столбцов Таблицы 2 и Таблицы 3. Следовательно, сумма выходит быть 4 в окончательном Таблица1

входных данных для таблицы находятся в следующей форме Таблица1: - (Table2 и Таблица3 находятся в аналогичной форме ввода)

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

Solution Пробовал:

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

@ Поиск - это работает. прежде чем я приму этот ответ, у меня есть последний вопрос. Что делать, если одна из таблиц (таблица2 или таблица3 не определена), и вайт, если обе таблицы2 и таблица3 не определены. Будет ли код по-прежнему работать в этих случаях? – Rihana

0

Если у вас есть один aggTable и массив 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); 
    }); 
} 
Смежные вопросы