如何在JavaScript中实例化多维数组?

时间:2017-04-11 20:48:18

标签: javascript arrays indexing

我需要做的就是:

var a = [[[]]]; 
a[1][2][3] = "hello!"; // [...[undefined,undefined,undefined,"hello!"]...];
a[1][2][1] = "a"; // [...[undefined,"a",undefined,"hello!"]...]
a[2][3][4] = "new_index" // [...[undefined,"a",undefined,"hello!"]...[undefinedx4, "new_index"]]

在我的情况下,我不希望在指定索引之前实例化数组的大小,并在更大的索引需要时增加大小。 在javascript中最简单或最干净的方法是什么,因为js是支持多维数组的弱点?

2 个答案:

答案 0 :(得分:1)

在JS数组中是引用类型,因此创建ND数组很棘手。 cloninig工具非常方便。因此,您可以执行以下操作;

extension Sequence where Iterator.Element == UIView {
    func setHidden(_ hidden: Bool) {
        for view in self {
            view.isHidden = hidden
        }
    }
}

buttons.setHidden(true)

初始参数定义尺寸,最后一个参数是填充值。

这应该适用于与ES6兼容的浏览器;

Array.prototype.clone = function(){
  return this.map(e => Array.isArray(e) ? e.clone() : e);
};
function arrayND(...n){
  return n.reduceRight((p,c) => c = (new Array(c)).fill().map(e => Array.isArray(p) ? p.clone() : p ));
}

var arr = arrayND (2,3,4,"x")
console.log(JSON.stringify(arr));

答案 1 :(得分:1)

这是我的解决方案:



function assign(input) {
    if ('object' !== typeof input) {
        let tmp = {};

        tmp[input] = arguments[1];
        input = tmp;
    }

    let regex = /\.?([^.\[\]]+)|\[(\d+)]/g;
    let result = {};

    for (let p in input) {
        let data = result, prop = '', match;

        while (match = regex.exec(p)) {
            data = data[prop] || (data[prop] = (match[2] ? [] : {}));
            prop = match[2] || match[1];
        }

        data[prop] = input[p];
    }

    return result[''];
}

// Example usage
let a = assign('3[4][5]', 'hello');
let b = assign('3[4][5][6]', 'world!');
let c = assign('you.can.use.object.as.well', 'cool!');
let d = assign('or.mix[3].them[2]', 'together!');
let e = assign({'with.multiple': 'properties', 'in.a.single': 'object'});

let f = assign({
    '[1][2][3]': "hello!",
    '[1][2][1]': "a",
    '[2][3][4]': "new_index"
});

console.log(a[3][4][5], '->', JSON.stringify(a));
console.log(b[3][4][5][6], '->', JSON.stringify(b));
console.log(c.you.can.use.object.as.well, '->', JSON.stringify(c));
console.log(d.or.mix[3].them[2], '->', JSON.stringify(d));
console.log(e.with.multiple, '->', e.in.a.single, '->', JSON.stringify(e));

console.log('f[1][2][3]:', f[1][2][3]);
console.log('f[1][2][1]:', f[1][2][1]);
console.log('f[2][3][4]:', f[2][3][4]);