如何在不使用扩展运算符的情况下扩展数组?

时间:2018-02-06 14:46:49

标签: javascript arrays ecmascript-6

是否有一种方法可以通过函数或数组方法在没有扩展运算符的情况下扩展数组。 我正在解决关于FCC的Algo挑战,并对此感到好奇。

function uniteUnique(arr) {
  var args = [].slice.call(arguments);
  var newArr = [];
  args.forEach(arr => newArr.push(...arr));
  return newArr.reduce((array, num) => {
    if(!array.includes(num)) {
      array.push(num);
    }
    return array;
  }, []);
}

3 个答案:

答案 0 :(得分:1)

var args = [].slice.call(arguments);
var newArr = [];
args.forEach(arr => newArr.push(...arr));

这部分代码只是将参数展平一级,也可以写成

var newArr  = [].concat.apply([], arguments);

return newArr.reduce((array, num) => {
   if(!array.includes(num)) {
     array.push(num);
   }
   return array;
}, []);

正在返回没有重复项的版本。也可以以不同的方式实现

//adding that, because it's so much simpler than your reduce
return [...new Set(newArr)]; 
return Array.from(new Set(newArr)); 

//or
return newArr.filter(function(v,i){ return newArr.indexOf(v) === i });

和整个事情

function uniteUnique( /*...arrays*/ ) {
  return [].concat.apply([], arguments)
    .filter(function(v, i, a) {
      return a.indexOf(v) === i
    });
}

console.log(uniteUnique(
  1, 
  [2, 3, 4], 
  2, 
  [3, 5], 
  [2, 4, 6, 8], 
  8, 
  [1, 3, 5, 7, 9]
));
.as-console-wrapper{top:0;max-height:100%!important}

如果你想要按多个(所有)级别展平,你可以这样做

//reusable helper
function _flatten(into, value){
  if(Array.isArray(value)) 
    return value.reduce(_flatten, into);

  into.push(value);
  return into;
}

function _unique(v,i,a){ 
  return a.indexOf(v) === i;
}

function uniteUnique( /*...arrays*/ ) {
  return _flatten([], [].slice.call(arguments))
    .filter(_unique);
}

或一体化解决方案

function uniteUnique( /*...arrays*/ ) {
  return (function _recursive(into, value){
    if(Array.isArray(value)) 
      return value.reduce(_recursive, into);

    if(into.indexOf(value) === -1) into.push(value);
    return into;
  })([], [].slice.call(arguments));
}

答案 1 :(得分:0)

const newArray = [...oldArray];

将产生与使用Array.prototype.concat相同的输出:

const newArray = [].concat(oldArray)

如果要将所有数组合并为一个数组,则可以使用Array.prototype.reduce

执行此操作
const newArray = args.reduce((acc, arr) => acc.concat(arr), [])

答案 2 :(得分:-1)

使用Function.prototype.apply()。请考虑使用apply()Using 'apply' to Emulate JavaScript's Upcoming Spread Operator来模拟传播的文章。

function uniteUnique(arr) {
  var args = [].slice.call(arguments);
  var newArr = [];

  args.forEach(arr => Array.prototype.push.apply(newArr, arr));

  return newArr.reduce((array, num) => {
    if(!array.includes(num)) {
      array.push(num);
    }
    return array;
  }, []);
}