使用javascript创建访问对象中项目的键

使用javascript创建访问对象中项目的键,javascript,json,ecmascript-6,javascript-objects,Javascript,Json,Ecmascript 6,Javascript Objects,我有一个下面的对象,我想从中获取staff数组中第一个项目的名称 const staffObj = { "staff":[ { "name": "tom"}, { "name": "sam"} ] } 我可以这样做 console.log(staffObj['staff'][0]['name']) console.log(staffObj.staff[0].name) 但我想做的是从我创建的变量访问我的对象 乙二醇 要实现这一点,正确的语法是什么?您不能将Javasc

我有一个下面的对象,我想从中获取staff数组中第一个项目的名称

const staffObj = {
  "staff":[
    { "name": "tom"},
    { "name": "sam"}
  ]
}
我可以这样做

console.log(staffObj['staff'][0]['name'])
console.log(staffObj.staff[0].name)
但我想做的是从我创建的变量访问我的对象 乙二醇


要实现这一点,正确的语法是什么?

您不能将Javascript源代码的比特放入这样的变量中。每个零件都需要变量:

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

如果要将currentField用作变量,可以执行此操作。注意firstITem[currentField]的currentField不在引号中。它是一个变量,由javascript计算,然后作为属性名应用。 常数staffObj={ 工作人员:[ {姓名:汤姆}, {姓名:萨姆} ] }; console.logstaffObj['staff'][0]['name']; console.logstaffObj.staff[0]。名称 const currentField='name'; const firstITem=staffObj.staff[0]; console.logfirstITem[currentField] 您的代码中缺少[0]。你应该为这些事情使用一个函数。例如:

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

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

没有这样的语法。使用eval执行此操作的唯一方法是:

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

如果currentField实际上是变量,那么每次更改currentField时都必须更改firstItem。

这是不可能的,但您可以通过将firstItem定义为函数来执行类似操作:

常数staffObj={ 工作人员:[ {姓名:汤姆}, {姓名:萨姆} ] }; const currentField='name'; const firstItem=x=>x['staff'][0][currentField];
console.logfirstItemstaffObj您看起来可能需要类似函数的东西

作为一个简短的提示,因为您似乎是一个初学者:

当然,这是依赖于组合的函数式编程,因此如果这不会给您带来太多的信息,您可以使用更熟悉的命令式版本:

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新手,我建议您使用第二种方法,这样在您了解第一种方法之前,它会更有意义,这将使您在JavaScript中更容易思考someObject.someProperty符号是someObject['someProperty'的缩写

这意味着,如果您想要动态计算属性名,则不能使用“点”表示法,因为someObject.someProperty将始终被解释为someObject['someProperty'],而不管someProperty可能是一个有效变量,其中包含一些字符串类型的值


另外,如果您尝试使用类似于someObject.someProperty的东西,您将得到未捕获的SyntaxError:Unexpected字符串,因为这不是一个有效的JS语法。

请看一看,这是不可能的,除非您在对象上实现了getter或proxy。这是eval不应该使用的。@Bergi,根据全球变暖,评估根本不应该使用。如果firstItem实际上是一个动态变量,那么这是唯一能够回答这个问题的解决方案,我相信这是正确的,因为这个问题本身。引用从我创建的变量访问我的对象否,这是使用函数的+1。
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 }
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);