创建密钥以使用javascript访问对象中的项目

时间:2017-06-01 22:00:03

标签: 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)

但我想要做的是从我创建的变量中访问我的对象 例如

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

实现此目的的正确语法是什么?

7 个答案:

答案 0 :(得分:1)

你不能把这些Javascript源代码放在这样的变量中。每个部分都需要变量:

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

答案 1 :(得分:1)

您的代码中缺少[0]。你应该使用一个函数来做这些事情。例如:

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

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

答案 2 :(得分:0)

如果要将currentField用作变量,可以执行此操作。请注意firstITem[currentField]如何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]);

答案 3 :(得分:0)

这是不可能的,但你可以通过将firstItem定义为函数来做类似的事情:

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

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

答案 4 :(得分: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 }

当然这是依赖于构图的函数式编程,所以如果这不会给你发送太多的内容,你可以使用更熟悉的命令式版本:

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的新手,我建议你做第二种方式,这样才会更有意义,直到你理解第一种方式(这将使你在承诺中的思考更容易)

答案 5 :(得分:0)

在JavaScript中,someObject.someProperty表示法是someObject['someProperty']的简写。

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

此外,如果您尝试使用someObject."someProperty"之类的内容,您将获得Uncaught SyntaxError: Unexpected string,因为这不是有效的JS语法。

答案 6 :(得分:-1)

没有这样的语法。使用eval的唯一方法就是:

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

如果currentField实际上是可变的,则每次更改firstItem时都必须更改currentField