RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 959030
Accepted
Pavel
Pavel
Asked:2020-03-20 20:39:19 +0000 UTC2020-03-20 20:39:19 +0000 UTC 2020-03-20 20:39:19 +0000 UTC

如何按字段比较对象数组?

  • 772

有 2 个数组rows_1, rows_2,并且有一个查找字段匹配的函数:

compare(rows_1, rows_2) {
  rows_1.forEach(row_1 => {
    rows_2.forEach(row_2 => {
      row_1['checked'] = row_1.id === row_2.sub.id;
    });
  });
}

我有 2 个嵌套循环。

如果没有双循环或 O(n2),这不能以某种方式更好地重写吗?

更新

对象结构:

rows_1 = [ {id: '1', title: '...'}, {id: '2', title: '...'}, ];
rows_2 = [ {sub: {id: '1', title: '...'}}, {sub: {id: '2', title: '...'}} ];
javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Alexander Lonberg
    2020-03-20T22:04:24Z2020-03-20T22:04:24Z

    你确定你的代码有效吗?
    下面是一个例子

    var rows_1 = [ /*{ id: '1', title: '...' }, { id: '2', title: '...' },*/ ];
    var rows_2 = [ /*{ sub: { id: '1', title: '...' } }, { sub: { id: '3', title: '...' } }*/ ];
    var rows_1_f = [ ], rows_2_f = [ ];
    
    var max  = 1000;
    var count = max;
    while ( --count ) {
        rows_1.push( { id: count, title: '...' } );
        rows_1_f.push( { id: count, title: '...' } );
        if ( count <= max/2 ) {
            rows_2.push( { sub: { id: count, title: '...' } } );
            rows_2_f.push( { sub: { id: count, title: '...' } } );
        }
    }
    
    // Ваш
    function compare ( rows_1, rows_2 ) {
        rows_1.forEach( row_1 => {
            rows_2.forEach( row_2 => {
                row_1['checked'] = row_1.id === row_2.sub.id;
            } );
        } );
    }
    
    
    function compareFast ( rows_1, rows_2 ) {
        var arr = [ ];
        rows_2.forEach( row_2 => {
            arr.push( row_2.sub.id );
        } );
        rows_1.forEach( row_1 => {
            row_1.checked = arr.indexOf( row_1.id ) !== -1;
        } );
    }
    
    console.time( 'compare' );
    compare( rows_1, rows_2 );
    console.timeEnd( 'compare' ); // compare: 10.747ms
    
    console.time( 'compareFast' );
    compareFast( rows_1_f, rows_2_f );
    console.timeEnd( 'compareFast' ); // compareFast: 1.098ms
    
    // Установите max в 10 и посмотрите что выводит ваш код
    //console.log( rows_1 );
    //console.log( rows_1_f );

    相差10倍左右。

    将max其设置为 10 并查看代码输出的内容

    在你的代码之后

    [ { id: 9, title: '...', checked: false },
      { id: 8, title: '...', checked: false },
      { id: 7, title: '...', checked: false },
      { id: 6, title: '...', checked: false },
      { id: 5, title: '...', checked: false },
      { id: 4, title: '...', checked: false },
      { id: 3, title: '...', checked: false },
      { id: 2, title: '...', checked: false },
      { id: 1, title: '...', checked: true } ]
    

    经过比较快

    [ { id: 9, title: '...', checked: false },
      { id: 8, title: '...', checked: false },
      { id: 7, title: '...', checked: false },
      { id: 6, title: '...', checked: false },
      { id: 5, title: '...', checked: true },
      { id: 4, title: '...', checked: true },
      { id: 3, title: '...', checked: true },
      { id: 2, title: '...', checked: true },
      { id: 1, title: '...', checked: true } ]
    
    • 1
  2. Андрей NOP
    2020-03-21T14:10:43Z2020-03-21T14:10:43Z

    无论如何尝试一下Set,我知道它的速度取决于实现,但最好这个类应该基于哈希表或二叉树,这将给出复杂度 O (1) 或 O (log n) vs. O ( n) 用于常规数组。在我的 chrome 中,选项的Set工作速度比数组(一千个元素)上的选项快 2-3 倍:

    var rows_1 = [ /*{ id: '1', title: '...' }, { id: '2', title: '...' },*/ ];
    var rows_2 = [ /*{ sub: { id: '1', title: '...' } }, { sub: { id: '3', title: '...' } }*/ ];
    var rows_1_f = [ ], rows_2_f = [ ];
    
    var max  = 1000;
    var count = max;
    while ( --count ) {
        rows_1.push( { id: count, title: '...' } );
        rows_1_f.push( { id: count, title: '...' } );
        if ( count <= max/2 ) {
            rows_2.push( { sub: { id: count, title: '...' } } );
            rows_2_f.push( { sub: { id: count, title: '...' } } );
        }
    }
    
    function compareFast ( rows_1, rows_2 ) {
        var arr = [ ];
        rows_2.forEach( row_2 => {
            arr.push( row_2.sub.id );
        } );
        rows_1.forEach( row_1 => {
            row_1.checked = arr.indexOf( row_1.id ) !== -1;
        } );
    }
    
    function compareWithSet (rows_1, rows_2) {
      let set = new Set(
        rows_2.map(row_2 => row_2.sub.id)
      );
      rows_1.forEach( row_1 => {
          row_1.checked = set.has(row_1.id);
      });
    }
    
    console.time( 'compareFast' );
    compareFast( rows_1_f, rows_2_f );
    console.timeEnd( 'compareFast' );
    
    console.time( 'compareWithSet' );
    compareWithSet( rows_1, rows_2 );
    console.timeEnd( 'compareWithSet' );

    测试的代码从附近的答案中被厚颜无耻地窃取了

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5