2016-08-20 74 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)