簡體   English   中英

如何在不使用擴展運算符的情況下擴展數組?

[英]How to spread an array without using a spread operator?

有沒有辦法通過函數或數組方法在沒有擴展運算符的情況下擴展數組。 我正在解決 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;
  }, []);
}
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));
}
const newArray = [...oldArray];

將產生與使用Array.prototype.concat相同的輸出:

const newArray = [].concat(oldArray)

如果您想將所有數組合並為一個,那么您可以使用Array.prototype.reduce 來完成

const newArray = args.reduce((acc, arr) => acc.concat(arr), [])

使用Function.prototype.apply() 考慮這篇關於使用apply()模擬傳播的文章: 使用 'apply' 來模擬 JavaScript 即將推出的傳播運算符

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;
  }, []);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM