Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数返回二维数组中的不同值_Javascript - Fatal编程技术网

Javascript 函数返回二维数组中的不同值

Javascript 函数返回二维数组中的不同值,javascript,Javascript,我有以下2D数组 var items = [['al','bv','sd'], ['al','cc','ab'], ['cv','vv','sw'], ['al','bv','sd'] ]; 我需要一个函数,它将返回一个类似的数组,但具有不同的值。例如,在上面的数组中,['al','bv','sd']发生两次 我希望函数返回我: var items = [['al','bv','sd'],

我有以下2D数组

var items = [['al','bv','sd'],
             ['al','cc','ab'],
             ['cv','vv','sw'],
             ['al','bv','sd']
            ];
我需要一个函数,它将返回一个类似的数组,但具有不同的值。例如,在上面的数组中,
['al','bv','sd']
发生两次

我希望函数返回我:

var items = [['al','bv','sd'],
             ['al','cc','ab'],
             ['cv','vv','sw']
            ];

由于这听起来像是某种学校作业,我将提供想法,而不是代码。您应该考虑人类如何查看该二维阵列,并确定其中一个阵列是否唯一。我们必须查看每一行,以确定每一行是否唯一。听起来像是嵌套的for循环…

您可以执行以下操作:

var result = [];
result.push(items[0]);
for (i = 1; i < items.length; i++){
    var ok;
    for (j = 0; j < i; j++){
        if (result[j].length != items[i].lenght) continue;
        ok = false;
        for (k = 0; k < items[i].length; k++) if (items[i][k] != result[j][k]) ok = true;
        if (ok == false) break; 
    }
    if (ok) result.push(items[i]);
}
return result;
var结果=[];
结果推送(项目[0]);
对于(i=1;i
您必须循环两次(或三次):

  • 从头到尾循环所有“行”
  • 从开始到结束,在所有“行”中再次循环

    • 如果列表相等,则忽略它
    • 否则,
  • 循环遍历所有“列”:

    • 如果值不相等,则跳转到父循环
    • 循环完成后,使用以下方法移除元素
  • 演示: 代码:


    假设数据很小,则为(var i=0;i快速脏解

    在每次迭代中,将行转换为字符串。如果映射中不存在值为True的字符串,请使用字典存储该字符串。此外,请将其添加到输出数组中。如果该字符串已存在于字典中,请转到下一项

    例如:

    var d = {};
    var out = [];
    for( var i = 0; i < items.length; i++ ) {
        var item = items[i];
        var rep = item.toString();
    
        if (!d[rep]) {
            d[rep] = true;
            out.push(item);
        }
    }
    
    // out has the result
    
    vard={};
    var out=[];
    对于(变量i=0;i
    非传统但更易于编码的版本

    var items = [['al','bv','sd'],
                 ['al','cc','ab'],
                 ['cv','vv','sw'],
                 ['al','bv','sd']
                ];
    
    var temp = {};
    
    for ( var i in items ) {
        var serialized = JSON.stringify(items[i]);
        if ( temp[serialized] ) {
            items.splice( i, 1 );
            continue;
        }
        temp[serialized] = true;
    } 
    
    在这里试试

    更传统的选择:

    var items = [['al','bv','sd'],
                 ['al','cc','ab'],
                 ['cv','vv','sw'],
                 ['al','bv','sd']
                ];
    
    var results = [];
    
    loop: for ( var i in items ) {
        compare: for ( var j in results ) {
            for ( var k in items[i] ) {
                if ( items[i][k] !== results[j][k] ) {
                    break compare;
                }
            }
            continue loop;
        }
        results.push( items[i] );
    }
    

    函数数组_equal(a,b){return!!a&&!!b&!(a如果您可以使用,这是一个很好的解决方案(请注意,根据您的平台,“require”关键字可能有所不同,这是如何在Node.js中使用它):

    这将是输出

    [ [ 'a', 'b', 'c' ], [ 'a' ] ]
    

    如果数组中元素的顺序对您很重要,即此数组['a','b','c']被认为与此数组['b','a','c']不同,则只需删除“排序”部分:

    这将是输出:

    [ [ 'a', 'b', 'c' ], [ 'a' ], [ 'b', 'a', 'c' ] ]
    

    一个简单的排序和筛选函数就可以完成这个任务

    var项目=[
    ['al','bv','sd'],
    ['al','cc','ab'],
    [‘cv’、‘vv’、‘sw’],
    ['al','bv','sd']
    ];
    变量温度=“”
    var unique=items.sort().filter(r=>{
    if(r.join(“”)==temp){
    temp=r.join(“”)
    返回真值
    }
    })
    
    console.log(唯一);
    它必须是纯JavaScript还是可以使用jQuery?非常感谢Rob。我的嵌套for循环给了我一些错误谢谢你提到lodash,我感觉它会帮我很多忙:)@ArnaudBouchot-是的,它会的,很棒的工具:)
    var _ = require('lodash');
    var objects = [['a', 'b', 'c'],['a'],['b', 'a', 'c']];
    objects.forEach(innerArr => {
      innerArr.sort();
    });
    console.log(_.uniqWith(objects, _.isEqual));
    
    [ [ 'a', 'b', 'c' ], [ 'a' ] ]
    
    var _ = require('lodash');
    var objects = [['a', 'b', 'c'],['a'],['b', 'a', 'c'], ['a','b','c']];
    console.log(_.uniqWith(objects, _.isEqual));
    
    [ [ 'a', 'b', 'c' ], [ 'a' ], [ 'b', 'a', 'c' ] ]