在Javascript中读取带有数组的数组?

时间:2016-08-20 16:08:45

标签: javascript arrays

如果a=[[1,[],"f",3],[3,[4,"x"]]]b=[1,1]

我想通过a b阅读a[1][1],以[4,"x"]获取b。请注意,eval('a['+b.join('],[')+']')是一个只应由整数组成的数组。

您也可以执行Array.prototype.readByArray = function(a) { var c = this; for (var i = 0; i < a.length; i++) { c = c[a[i]]; } return c; }; Array.prototype.emptyByArray = function(a) { var c = this.readByArray(a); c.splice(0, c.length); }; Array.prototype.concateByArray = function(a, e) { var c = this.readByArray(a); for (var i = 0; i < e.length; i++) { c.push(e[i]); } }; Array.prototype.setByArray = function(a, e) { this.emptyByArray(a); this.readByArray(a).push(e); }; 但需要将实际变量名称作为字符串,这很难看。

以下是我的一些功能:

Array.prototype.readByArray=function(a){var c=this;for(var i=0;i<a.length;i++){c=c[a[i]];}return c;};
var a = [1,2,3,[1,2,3,[{x: 3},"test"],4],"foo","bar"]; //Your array
var b = [0]; //Reading stack
var s = '[\n'; //Output
while(b[0]<a.length){
    if(Array.isArray(a.readByArray(b))){
        s+=' '.repeat(b.length)+'[\n';
        b.push(-1);
    }else{
        s+=' '.repeat(b.length)+JSON.stringify(a.readByArray(b))+'\n';
    }
    b[b.length-1]++;
    while(b[b.length-1]>=a.readByArray(b.slice(0,-1)).length){
        b.pop();
        b[b.length-1]++;
        s+=' '.repeat(b.length)+']\n';
    }
}
console.log(s);

在此示例中,这对于以命令方式读取嵌套数组非常有用:

{{1}}

有没有更好的方法呢?是否有本机功能?

2 个答案:

答案 0 :(得分:3)

您可以使用Array#reduce

从整个数组开始,为b的每个元素返回数组的一部分,直到使用所有索引。

var a = [[1, [], "f", 3], [3, [4, "x"]]],
    b = [1, 1],
    result = b.reduce(function (v, i) {
        return v[i];
    }, a);
    
console.log(result);

ES6

var a = [[1, [], "f", 3], [3, [4, "x"]]],
    b = [1, 1],
    result = b.reduce((v, i) => v[i], a);
    
console.log(result);
result[0] = 42;
console.log(a);
result.splice(0, result.length, 'test');
console.log(a);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

我为此目的编写了一个可重用的通用代码,以动态获取嵌套对象属性。实际上我是针对对象,但因为在JS中数组是一个完美的对象,它也适用于数组。因此,让我们看看它在这种特殊情况下的工作原理;

Object.prototype.getNestedValue = function(...a) {
  return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]];
};

var a = [[1,[],"f",3],[3,[4,"x"]]],
    b = [1,1],
    c = a.getNestedValue(...b);
console.log(c)