Javascript 函数返回二维数组中的不同值
我有以下2D数组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'],
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' ] ]