【保存版】js 現場で役立つスニペット集

【保存版】js 現場で役立つスニペット集:


どんなに多次元の配列でもディープコピー(値渡し)する

/** 
 * @return {[type]}         [description] 
 */ 
Array.prototype.clone = function() { 
  return JSON.parse(JSON.stringify(this)); 
}; 


.map の多次元版

/** 
 * INFO: 3次元以降に対応していない。したい。 
 * @param  {[type]} 
 * @return {[type]} 
 */ 
Array.prototype.mapAll = function(fn) { 
  return this.map((a, y)=> { 
    return a.map((v, x)=> { 
      return fn(v, { x:x, y:y }, this); 
    }); 
  }); 
}; 


右回転する

/** 
 * 右回転する 
 * INFO: 3次元以降に対応していない。したい。 
 * @return {[type]} [description] 
 */ 
Array.prototype.turn = function() { 
  return this.mapAll((_, p, a)=> this[this.length-1-p.x][p.y]); 
}; 


条件にあてはまる要素のkeyを配列にして返す

// 例 
var a = [ { number: 10 }, { number: 20 }, { number: 20 }, { number: 30 } ]; 
var b = a.reduce(function( prev, curr, index, array ) { 
    if ( curr.number === 20 ) { 
        prev.push( index ); 
    } 
    return prev; 
}, [] ); 
console.log(b); 


JSON.parse can parse 'false', '1' to false, 1 as well.

/** 
   * @return {any} - "getAttribute" is return null when not found the attribute. 
   */ 
  getValueByAttr(attributeName) { 
    var v = document.querySelector('[data-aja-meta-search]').getAttribute(attributeName); 
    // INFO: parse `'false'`, `'1'` to `false`, `1` as well. 
    return JSON.parse(v); 
  } 


2つの配列をマージする

  • コンフリクト起きた要素はcallbackが発火される
  • callbackを使ってどちらの値を使うかなど選択できる
/** 
 * 非破壊型 
 * sample: `[0,1].merge(1, [0,0]) => [0,0,0]` 
 * @param  {[type]}   X   - 位置をindexで指定 
 * @param  {[type]}   arr - マージしたい配列 
 * @param  {Function} fn  - call when conflict. 
 * @return {[type]}       [description] 
 * 
 * INFO: .map関数でやりたかったが値が特殊値`empty`の場合はmapのコールバックが呼ばれないorz 
 */ 
Array.prototype.merge = function(X, arr, fn = function(val1, val2) { return val2 }) { 
  var newArr = []; 
  var newArrLength = Math.max(X + arr.length, this.length); 
  for (var i = 0; i < newArrLength; i++) { 
    var val = this[i]; 
    if(i<X) { 
      newArr[i] = val; 
    } 
    else if(undefined !== this[i] && undefined !== arr[i-X]) { 
      newArr[i] = fn(val, arr[i-X], i); 
    } 
    else { 
      newArr[i] = undefined !== arr[i-X] ? arr[i-X] : this[i]; 
    } 
  } 
  return newArr; 
}; 


縦軸と横軸入れ替える

/** 
 * 縦軸と横軸入れ替える 
 * `左上と右下を結ぶ`軸で入れ替えるのであらゆる面で都合が良い 
 * @return {[type]} 
 */ 
Array.prototype.transpose = function() { 
  return this[0].map((_, i)=> this.map(a=> a[i])); 
} 


consoleに視認性良く表示させる

/** 
 * 2次元配列専用 
 * @return {[type]} 
 */ 
Array.prototype.stringify = function() { 
  var str = '\n'; 
  this.forEach((arr)=> { 
    str += JSON.stringify(arr) + "\n"; 
  }); 
  return str; 
}; 


条件(fn)にあった場所を{x, y}の配列で返す

/** 
 * INFO: 3次元以降に対応していない。したい。 
 * @param {function} 
 *        @arg {any} - {探索中の値} 
 *        @arg {object} - {x,y} 
 * @return {Array} 
 */ 
Array.prototype.getPositions = function(fn) { 
  return this.map((a, y)=> { 
    return a.map((v, x)=> { 
      return fn(this[y][x], { x:x, y:y }) ? { x:x, y:y } : undefined; 
    }).filter((v)=> v!==undefined); 
  }) 
  // INFO: 2次元配列を1次元配列に 
  .reduce((pre,current) => {pre.push(...current);return pre},[]); 
}; 
 
// 以下も同じ 
 
Array.prototype.getPositions = function(fn) { 
  return this.reduce((prev1,curr1,y,a)=> { 
    return a.reduce((prev2,curr2,x)=> { 
      if (fn(this[y][x], { x:x, y:y })) { 
        prev1.push({ x:x, y:y }); 
      } 
      return prev1; 
    }, []); 
  }, []); 
}; 

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)