serverjs/BetterArray.js

'use strict';

class BetterArray extends Array{

	/**
 	 * Массив с дополнительными методами.
 	 * @extends {Array}
	* @param  {...any} [arg] элементы массива
	*/
	constructor(...arg){
		super(...arg);
	}

	static get [Symbol.species]() { return Array; }

	/**
	* Перемешивает массив (Fisher–Yates Shuffle).
	*/
	shuffle(){
		let currentIndex = this.length,
			temporaryValue,
			randomIndex;

		// While there remain elements to shuffle...
		while (0 !== currentIndex) {

			// Pick a remaining element...
			randomIndex = Math.floor(Math.random() * currentIndex);
			currentIndex -= 1;

			// And swap it with the current element.
			temporaryValue = this[currentIndex];
			this[currentIndex] = this[randomIndex];
			this[randomIndex] = temporaryValue;
		}
	}

	/**
	* Перемешивает определенное свойство объектов массива (Fisher–Yates Shuffle).
	* @param  {string} key свойство
	*/
	shuffleKey(key){
		let currentIndex = this.length,
			temporaryValue,
			randomIndex;

		while (0 !== currentIndex) {

			randomIndex = Math.floor(Math.random() * currentIndex);
			currentIndex -= 1;

			temporaryValue = this[currentIndex][key];
			this[currentIndex][key] = this[randomIndex][key];
			this[randomIndex][key] = temporaryValue;
		}
	}

	/**
	* Создает объект по значениям переданного ключа.  
	* `[{key: 'key1'}, {key: 'key2'}]` => `{key1: {key: 'key1'}, key2: {key: 'key2'}} `  
	* Пропускает элементы без заданных ключей и с пустыми ключами
	* @param  {string} key свойство
	* @return {object<any>} Объект по значениям ключа. 
	*/
	byKey(key){
		let obj = {};
		this.forEach((v) => {
			if(!v || typeof v != 'object' || !v[key]){
				return;
			}
			obj[v[key]] = v;
		});
		return obj;
	}

}

/**
* {@link BetterArray}
* @module
*/
module.exports = BetterArray;