2016-08-20 81 views
3

如果a=[[1,[],"f",3],[3,[4,"x"]]]b=[1,1]用Javascript中的数组读取数组?

我想读a通过ba[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

普罗蒂普:不要改变'Array'的原型。它会让你头痛得多而不是有用。 –

+0

@Derek朕会功夫举几个例子。 –

+1

[*为什么要扩展原生对象是一个不好的做法?](https://stackoverflow.com/questions/14034180/why-is-extending-native-objects-a-bad-practice)过去十年来,许多图书馆都有试图修改内建对象的原型,并且都失败了。总的原则是,你只改变你自己的东西,留下你自己没有的东西。 –

回答

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; }

+0

使用ES6,你可以用'const result = b.reduce((v,i)=> v [i],a)' – bitten

+1

'看起来像你已经更新了它;' – bitten

+0

谢谢,我可以更改'[4,“x”]'里面的元素吗? –

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)