array & matrix methods
const array_matrix_methods = {
    
    // ---------------------
    //     array methods
    // ---------------------
    
    // arr.isEmpty
    get isEmpty() { return this.length === 0 },
    
    // arr.last
    get last() { return this[this.length - 1] },
    
    // arr.max(f): f must be a real-valued function
    max(f=x=>x){ return Math.max(...this.map(x => f(x)))},
    // ------------------------
    //     2D array methods
    // ------------------------
    // assuming:
    // - elements in array are themselves arrays.
    // - an element in array is called a "row".
    // arr2d.numberOfRows
    get numberOfRows() { return this.length },
    
    // arr2d.maxRowLength
    get maxRowLength() { return this.max(row => row.length) },
    // arr2d.maxColumnIndex
    get maxColumnIndex() { return this.maxRowLength - 1 },
    // arr2d.transpose
    get transpose() {
        return Array.from({length: this.maxRowLength}, (_, j) => 
            this.map(row => row[j])
        );
    },
    // arr2d.map2D()
    map2D(f) {
        return this.map((row, i) => 
            row.map((value, j) => f(value, i, j))
        )
    },
    // ---------------------
    //     matrix methods
    // ---------------------
    // assuming:
    // - every element (row) is still an array of the same length
    // matrix.numberOfColumns
    get numberOfColumns() { return this[0].length },
};⬆️ 需要: .assignDescriptors()
// ⭐ extending Array.prototype
Object.assignDescriptors(Array.prototype, array_matrix_methods);
// test data
let arr = [1, 2, 5, 50, 10];
let filtered = arr.filter(x => x >= 10);    //
let arr2d = [
    [1,2,3],
    [1,2,3,4],
    [1,2]
];
// ---------------- output -----------------
arr.isEmpty,             // false
arr.last,                // 10
arr.max(),               // 50
filtered,                // [ 50, 10 ]
filtered.isEmpty,        // false
arr2d.numberOfRows,      // 3
arr2d.maxRowLength,      // 4
arr2d.map2D((_, i, j) => i === j ? 1 : 0),
// [ [ 1, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0 ] ]
arr2d.transpose,
// [
//   [ 1, 1, 1 ],
//   [ 2, 2, 2 ],
//   [ 3, 3, undefined ],
//   [ undefined, 4, undefined ]
// ]Last updated
Was this helpful?