如何使用reduce()将数组推入数组

时间:2016-07-15 12:47:21

标签: javascript arrays

我正在编写一个从一组参数中删除重复项的应用程序。我能够弄清楚如何删除它们,但它只有在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]

有什么方法可以实现这一目标?谢谢!

2 个答案:

答案 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 而不是sliceconcat将数组展平到上一级),然后迭代concat中的每个current项检查是否有重复。

<强>样本

&#13;
&#13;
reduce
&#13;
&#13;
&#13;

如果需要删除重复数组,则需要迭代并检查数组是否相等。

<强>样本

&#13;
&#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;
&#13;
&#13;

答案 1 :(得分:1)

result.concat(current)的参数将附加到result。如果参数是数组,则将追加其元素。所以 - 为了附加一个数组 - 你需要提供一个数组数组:

&#13;
&#13;
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;
&#13;
&#13;

实现相同功能的更快捷方式是:

&#13;
&#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;
&#13;
&#13;

两个实现都将包含相同元素的两个数组视为不同(根据JavaScript的对象相等语义)。