javascript更高阶函数变量undefined

时间:2014-09-05 07:40:39

标签: javascript arrays function higher-order-functions

我有这个对象数组,并希望给定特定键的唯一元素。 该数组如下所示:

var items = [
    {name: "item1", year : 2013, value : 100},
    {name: "item1", year : 2012, value : 97},
    {name: "item3", year : 2013, value : 93 },
    {name: "item3", year : 2012, value : 91 },
    {name: "item2", year : 2012, value : -6 },
    {name: "item2", year : 2011, value : -5 },
    {name: "item4", year : 2012, value : -36 },
    {name: "item3", year : 2011, value : 93 },
    {name: "item4", year : 2013, value : -35 },
    {name: "item1", year : 2011, value : 98},
    {name: "item2", year : 2013, value : -7 },
    {name: "item4", year : 2011, value : -37 },
    {name: "item5", year : 2013, value : 58 },
    {name: "item5", year : 2012, value : 55 },
    {name: "item5", year : 2011, value : 54 }];

我使用以下函数获取键名的唯一元素列表:

var unique = function (arr) {
    return arr.reduce(function (prev, curr) {
        if (prev.indexOf(curr.name) === -1) {prev.push(curr.name)}
        return prev;
    }, [])}

所以当我做console.log(unique(items))时,我得到了正确的数组:

[ 'item1', 'item3', 'item2', 'item4', 'item5' ]

如果我在curr.name中使用name更改year,我会得到正确的结果。 我想做一个更高阶的函数,所以我可以传递我正在处理的数组和键,所以我会做unique(items, 'name')或者unique(items, 'year')但是当我将我的唯一函数转换为:< / p>

var unique = function (arr, criteria) {
    return arr.reduce(function (prev, curr) {
        if (prev.indexOf(curr.criteria) === -1) {prev.push(curr.criteria)}
        return prev;
    }, [])}

我做console.log(unique(items, 'name'))我得undefined !? 如果我console.log(unique(items, name)我收到错误ReferenceError:名称未定义!!

1 个答案:

答案 0 :(得分:2)

使用bracket notation访问该媒体资源:

if (prev.indexOf(curr[criteria]) === -1) {prev.push(curr[criteria])}