我正在编写一个从一组参数中删除重复项的应用程序。我能够弄清楚如何删除它们,但它只有在arguments数组的元素是数字而不是数组本身时才有效:
function unite() {
var args = [].concat.apply([], arguments);
return args.reduce(function(result, current){
return result.indexOf(current) === -1 ? result.concat(current) : result;
}, []);
}
此代码:
unite([1, 3, 2], [5, 2, 4, 4], [2, 1]);
返回[1,3,2,5,4]
而这一个:
unite([1, 3, 2], [5, [7], 4, 4], [2, 1]);
返回[1,3,2,5, 7 ,4]
我需要它回来 [1,3,2,5, [7] ,4]
有什么方法可以实现这一目标?谢谢!
答案 0 :(得分:1)
先使用Public Sub getPeople()
Try
Dim sql As String = "SELECT * FROM tblPerson ORDER BY [personID] ASC;"
Dim cm As New OleDbCommand(sql, Globals.m_database.getConnection())
Dim da As New OleDbDataAdapter(cm)
Dim dt As New DataTable()
da.Fill(dt)
ugData.DataSource = dt
Catch Ex As Exception
mdi1.errorLog(Ex.Message, Ex.StackTrace)
MsgBox("Failed to retrieve data, refer to error log")
End Try
End Sub
而不是slice
(concat
将数组展平到上一级),然后迭代concat
中的每个current
项检查是否有重复。
<强>样本强>
reduce
&#13;
如果需要删除重复数组,则需要迭代并检查数组是否相等。
<强>样本强>
function unite() {
var args = [].slice.apply(arguments);
return args.reduce(function(result, current){
//console.log(result, current)
current.forEach( function(item){ result.indexOf( item ) == -1 && result.push( item ); }) ;
return result;
}, []);
}
console.log( unite([1, 3, 2], [5, [7], 4, 4], [2, 1]) );
&#13;
答案 1 :(得分:1)
result.concat(current)
的参数将附加到result
。如果参数是数组,则将追加其元素。所以 - 为了附加一个数组 - 你需要提供一个数组数组:
function unite() {
var args = [].concat.apply([], arguments);
return args.reduce(function(result, current) {
return result.indexOf(current) === -1 ? result.concat([current]) : result;
}, []);
}
console.log(unite([1, 2], [2, 3], [[7]], [[7]]));
&#13;
实现相同功能的更快捷方式是:
function* iterate(...arrays) {
for (array of arrays) yield* array;
}
function unite(...arrays) {
return Array.from(new Set(iterate(...arrays)));
}
console.log(unite([1, 2], [2, 3], [[7]], [[7]]));
&#13;
两个实现都将包含相同元素的两个数组视为不同(根据JavaScript的对象相等语义)。