2014-09-05 181 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])}