Переменная функции высшего порядка javascript undefined

У меня есть этот массив объектов, и я хочу, чтобы уникальные элементы получили определенный ключ. Массив выглядит так:

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' ]

Если я изменю name с year в curr.name я получаю правильный результат. Я хочу сделать функцию более высокого порядка, чтобы я мог передать массив, над которым я работаю, и ключ, так что я бы сделал 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: имя не определено!!

1 ответ

Решение

Используйте обозначение в скобках для доступа к свойству:

if (prev.indexOf(curr[criteria]) === -1) {prev.push(curr[criteria])}
Другие вопросы по тегам