2017-06-01 34 views
0

我有下面的對象,我想獲得職員數組中的第一項的名稱。使用javascript創建訪問對象中的項的鍵

const staffObj = { 
    "staff":[ 
    { "name": "tom"}, 
    { "name": "sam"} 
    ] 
} 

我可以做任何

console.log(staffObj['staff'][0]['name']) 
console.log(staffObj.staff[0].name) 

但我想要做的就是從一個變量來訪問我的目標,我創建 如

const currentField = 'name'  
const firstITem = ['staff'][currentField ] 
console.log(firstITem,staffObj.firstITem) 

什麼是正確的做到這一點語法來實現這個?

+2

也許看看[用字符串鍵訪問嵌套的JavaScript對象](https://stackoverflow.com/q/6491463/218196) –

+0

這是不可能的(除非你在對象上實現一個getter或代理) – Bergi

回答

1

你不能把一些Javascript源代碼放在這樣的變量中。你需要的變量每個零件:

const currentType = 'staff'; 
const currentField = 'name'; 
console.log(staffObj[currentType][0][currentField]); 
0

,如果你想使用currentField作爲變量你可以做到這一點。請注意0​​有currentField這是不是引號。它是一個變量並通過javascript進行評估,然後作爲屬性name應用。

const staffObj = { 
 
    "staff":[ 
 
    { "name": "tom"}, 
 
    { "name": "sam"} 
 
    ] 
 
}; 
 

 
console.log(staffObj['staff'][0]['name']); 
 
console.log(staffObj.staff[0].name) 
 

 
const currentField = 'name'; 
 
const firstITem = staffObj.staff[0]; 
 
console.log(firstITem[currentField]);

1

你缺少你的代碼[0]。你應該使用這樣的功能。例如:

function firstFtaffField(staffObj, field) { 
    return staffObj['staff'][0][field]; 
} 

// Usage 
var name = firstFtaffField(staffObj, 'name'); 
+0

+ 1代表「使用功能」。 – Bergi

-1

沒有這樣的語法。你可以使用eval做到這一點的唯一方法:

const staffObj = { 
    "staff":[ 
    { "name": "tom"}, 
    { "name": "sam"} 
    ] 
}; 
const currentField = 'name'; 
const firstItem = ".staff[0]." + currentField; 
console.log(eval("staffObj" + firstItem)); 

如果currentField實際上是可變的,那麼你將不得不每次改變currentField時間來改變firstItem爲好。

+0

這是什麼'eval'應**不**用於。 – Bergi

+0

@Bergi,根據全球變暖eval不應該使用。如果firstItem實際上是一個動態變量,這是唯一可以回答問題的解決方案,我相信這是因爲問題本身。引用「訪問我的對象從**變量**我創建」 – Viacheslav

+0

不,這是[不是唯一的解決方案](https://stackoverflow.com/a/6394168/1048572)。 – Bergi

0

那是不可能的,但你可以通過定義firstItem作爲函數做同樣的事情:

const staffObj = { 
 
    "staff":[ 
 
    { "name": "tom"}, 
 
    { "name": "sam"} 
 
    ] 
 
}; 
 

 
const currentField = 'name'; 
 
const firstItem = x => x['staff'][0][currentField]; 
 
console.log(firstItem(staffObj))

0

你看起來可能希望類似的功能!

作爲一個快速的注意,因爲你似乎是一個初學者:Arrow Functions

var get = n => c => c[n]; // function given a nest returns a function given a container returns the nest inside the container 
var obj = { 
    staff:[ 
    { name: 'tom' }, 
    { name: 'sam' } 
    ] 
}; 

var getFirst = get(0); 
var getStaff = get('staff'); 

console.log(getFirst(getStaff(obj))); // { name: 'tom } 

當然,這是relys的成分,因此,如果不作過多發送給你,你可以代替函數式編程去一個更熟悉的當務之急版本:

var obj = { staff: [ {name:'tom'}, {name:'sam'}]}; 
var getStaff = obj => obj['staff']; 
var getFirst = ary => ary[0]; 

var staff = getStaff(obj); 
var firstStaff = getFirst(staff); 

// alternate 
//var getFirstStaff = obj => getFirst(getStaff(obj)); 

console.log(firstStaff); 

正如你可以看到有兩個之間有一些相似之處,但組成以相反的順序做了一些更先進的技術(組成,討好)。因爲你似乎是JS的新手,所以我建議你做第二種方法,這樣纔會更有意義,直到你理解第一種方式(這會讓承諾中的思考變得更容易)

0

在JavaScript中,someObject.someProperty表示法是簡寫爲someObject['someProperty']

這意味着如果你想有一個動態計算的屬性名,你不能用「」符號,因爲someObject.someProperty總是會不顧事實someProperty也許是持有有效的變量解釋爲someObject['someProperty']字符串類型的一些值。

此外,如果您嘗試使用類似someObject."someProperty"的東西,您將獲得Uncaught SyntaxError: Unexpected string,因爲這不是有效的JS語法。