【问题标题】:Array of Objects- Increment a column comparing with other column data对象数组 - 与其他列数据相比增加一列
【发布时间】:2016-05-06 16:36:50
【问题描述】:

我手头有一个非常复杂的计算,我发现很难通过它。这里是。我有一张桌子。

表 1:(名称、ID、位置和总和是表的列)

Name | table1_ID | Location | Sum
rick |  1        | Gorets   | 
alex |  3        | hebrew   |

表 2:(City、ID、Sex 是表的列)

City | table2_ID | Sex
wew  | 34        | M
rfgf | 3         | F
dgff | 1         | M
hgfhg| 1  | F

表3:(Notice、ID、Flag是一个表的列)

Notice | table3_ID | Flag
hiji   | 1         |  true
asas   | 1         |  false   

表 1 所需的最终输出应如下所示。

根据表2和表3的值,表1应该是这样的

Name | table1_ID | Location | Sum
rick |  1        | Gorets   |  4
alex |  3        | hebrew   |  1

我将向您解释我想要实现的上述目标是什么。如您所见,第一个表列 sum 为空。这些根据 table2 和 table3 中的条目获取更新。

基本上。在 table2 和 table3 的 'ID' 中搜索 table1 中的 'ID'。例如。在 table2 和 table3 中搜索值为 '1' 的 ID。它发现 ID 在第二个和第三个表中出现了 4 次。所以它会将总和值设为 4。

同样会在另外2个表中搜索3,发现只出现过一次,所以会在'sum'列更新ID为'3'的1。

我希望你已经得到了我想要达到的目标。如果我为 3 个表数据执行 console.log,结果如下:

表 1 :- console.log(userinfo);

[Object][Object]
 [0-1]
   [0]: Object
     Name: 'rick'
     table1_ID: 1
     Location:Gorets
     Sum:
   [1]: Object
     Name: 'alex'
     table1_ID: 3
     Location:hebrew
     Sum:

其他 2 个表格的输出格式类似。有人可以让我知道如何更新 Sum: 使用上面提到的计算值。

【问题讨论】:

    标签: javascript arrays database object


    【解决方案1】:

    您可以使用一个对象来获取表 3 中 ID 的所有计数,并作为表 2 计数的输入,并将其用作在表 1 中分配总和的查找。

    function count(r, a) {
        r[a.ID] = (r[a.ID] || 0) + 1;
        return r;
    }
    
    var table1 = [{ Name: 'rick', ID: 1, Location: 'Gorets', Sum: undefined }, { Name: 'alex', ID: 3, Location: 'hebrew', Sum: undefined }, { Name: 'foo', ID: 42, Location: 'bar', Sum: undefined }],
        table2 = [{ City: 'wew', ID: 34, Sex: 'M' }, { City: 'rfgf', ID: 3, Sex: 'F' }, { City: 'dgff', ID: 1, Sex: 'M' }, { City: 'hgfhg', ID: 1, Sex: 'F' }],
        table3 = [{ Notice: 'hiji', ID: 1, Flag: true }, { Notice: 'asas', ID: 1, Flag: false }];
    
    table1.forEach(function (a) {
        a.Sum = this[a.ID] || '-';
    }, table2.reduce(count, table3.reduce(count, Object.create(null))));
    
    document.write('<pre>' + JSON.stringify(table1, 0, 4) + '</pre>');

    编辑

    如果我们将 table1_ID、table2_ID 和 table3_ID 作为列名而不是 ID 作为所有 3 个表的列名,该怎么办。请问我必须对代码进行哪些更改?

    function count(key) {
        return function (r, a) {
            r[a[key]] = (r[a[key]] || 0) + 1;
            return r;
        };
    }
    
    var table1 = [{ Name: 'rick', table1_ID: 1, Location: 'Gorets', Sum: undefined }, { Name: 'alex', table1_ID: 3, Location: 'hebrew', Sum: undefined }, { Name: 'foo', table1_ID: 42, Location: 'bar', Sum: undefined }],
        table2 = [{ City: 'wew', table2_ID: 34, Sex: 'M' }, { City: 'rfgf', table2_ID: 3, Sex: 'F' }, { City: 'dgff', table2_ID: 1, Sex: 'M' }, { City: 'hgfhg', table2_ID: 1, Sex: 'F' }],
        table3 = [{ Notice: 'hiji', table3_ID: 1, Flag: true }, { Notice: 'asas', table3_ID: 1, Flag: false }];
    
    table1.forEach(function (a) {
        a.Sum = this[a.table1_ID] || '-';
    }, table2.reduce(count('table2_ID'), table3.reduce(count('table3_ID'), Object.create(null))));
    
    document.write('<pre>' + JSON.stringify(table1, 0, 4) + '</pre>');

    【讨论】:

    • 如果没有匹配 - 我如何显示 '-' 而不是数字 0 作为总和?
    • 最后一个疑问...如果不是 ID 作为所有 3 个表的列名,我们将 table1_ID、table2_ID 和 table3_ID 作为列名。请问我需要对代码进行哪些更改?
    • 我用最后一个疑问更新了我的问题。如果所有 3 个表上的列名不同,您能帮我指出更改吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    相关资源
    最近更新 更多