Переменная функции высшего порядка 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])}