2014-09-05 183 views
0

我有这个对象数组,并且想要赋予特定键的唯一元素。 数组是这样的:javascript高阶函数变量未定义

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(唯一的(项目))我得到正确的数组:

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

如果我在curr.name改变nameyear我得到正确的结果。 我想要做一个高阶函数,所以我既可以通过我的工作的阵列和关键,所以我会做unique(items, 'name')或可替代unique(items, 'year')但是当我改变我的独特功能,这一点:

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:name is not defined !!

回答

2

使用bracket notation来访问属性:

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