2016-09-30 80 views
1

我正在玩亚马逊alexa的技巧,并试图写我自己的。我有一些技能元素的数组,但我无法访问这些元素。我相信我所做的一切都正确,我已经使用了一点点,但似乎没有任何工作?!数组无法访问元素?

var myArray = [ 
    { "name" : "matt", "content" : "this is about matt" }, 
    { "name" : "james", "content" : "this is about james" }, 
]; 

我然后具有基于其使用的名称作为取景器的用户输入一些代码。

var requestedName = "matt"; 
var contentToRead = myArray.filter(function(v){ return v.name == requestedName; }); 
console.log("I'll read back, " + contentToRead.content); 

上面的console.log返回时未定义。我试图解析结果到一个数组,但我没有尝试似乎工作。

有什么想法?我相信这很简单,但我的知识还不足以真正知道要寻找什么来解决它!

+0

使用contentToRead [0]。内容而不是contentToRead.content –

回答

3

.filter过滤该数组,删除与过滤器不匹配的值;你会得到的还是一个包含多个对象的数组(因为谓词可能适用于数组中的多个值)。

你想要的行为,返回第一场比赛,在.find实现:

var contentToRead = myArray.find(function (v) { return v.name == requestedName; }); 
+0

完美谢谢! –

+0

请注意'.find'的兼容性,它不被所有浏览器支持。 – deceze

+0

我认为可能有多个结果具有相同的名称。如果过滤器是由一个独特的属性,或者如果意图是要找到第一次出现比没有问题,find()将是最好的解决方案.. –

2

Array.prototype.filter()创造与传递由给定函数执行的测试中所有元素的数组,所以contentToRead是一个数组:

var myArray = [ 
 
    { "name" : "matt", "content" : "this is about matt" }, 
 
    { "name" : "james", "content" : "this is about james" }, 
 
]; 
 

 
var requestedName = "matt"; 
 
var contentToRead = myArray.filter(function(v) { return v.name === requestedName; }); 
 
    
 
// You can loop over contentToRead array 
 
contentToRead.forEach(function(item) { 
 
    console.log("I'll read back, " + item.content); 
 
});

+0

是的这个也可以 - 谢谢你的解释:) –

1

filter创建一个新的数组,其中包含您传递的函数返回true的元素。

content不是阵列的性质,它是阵列内部的每个对象的属性。

您需要将元素从数组中取出才能读取其内容。

contentToRead.forEach(function (currentValue) { 
    console.log("I'll read back, " + currentValue.content); 
}); 
+0

不错!喜欢解释 – 4dgaurav

0

通过myArray.filter(function(v){ return v.name == requestedName; });返回的值是含有符合筛选对象的阵列。 当您只有一个对象,你可以访问它想:

contentToRead[0].name