#javascript
#javascript
Вопрос:
Я пытаюсь использовать метод reduce array для извлечения ключевых значений из объекта и возврата нового массива, содержащего только перечисленные значения. Вот мой код:
function extractValue(arr, key) {
let newArr = []
return arr.reduce(function(accum, nextVal) {
if(nextVal !== key)
newArr.push(accum[key] ', ' nextVal[key])
return newArr
})
}
let data = [ { name: 'bob' }
, { name: 'jim' }
, { name: 'sarah' }
, { age: 100 }
]
console.log( extractValue(data, 'name'))
По какой-то причине, когда я регистрирую свою функцию в консоли, мои результаты продолжают выглядеть так,
["bob", "jim", undefined, "Sarah", undefined, undefined]
.
Как я могу предотвратить отображение неопределенных результатов?
Комментарии:
1. Почему вы используете
reduce
для этого? Является ли это обязательным?2. Да, это обязательно.
Ответ №1:
То, как вы используете reduce, не совсем правильно … это должно быть больше похоже:
arr.reduce(function(accum, item) {
}, defaultValue);
На каждой итерации вы должны возвращать накопитель, независимо от условия.
Поскольку вы хотите вернуть другой массив, ваше значение по умолчанию имеет смысл использовать как пустой массив:
arr.reduce(function(accum, item) {
}, []);
В целом, код, который будет работать, будет примерно следующим:
function extractValue(arr, key) {
return arr.reduce(function(accum, item) {
if (!item[key]) {
return accum; // <--- we must still return the accumulator
}
accum.push(item[key])
return accum; // <---- and return accumulator here also
}, [])
}
Ответ №2:
Вы могли бы заранее отфильтровать и сопоставить требуемое значение.
function extractValue(arr, key) {
return arr
.filter(object => key in object)
.map(object => object[key]);
}
console.log(extractValue([{name: 'bob'}, {name: 'jim'}, {name: 'sarah'}, {age: 100}], 'name'));
При использовании reduce
вам необходимо вернуть прежний накопитель, если свойство не существует.
function extractValue(arr, key) {
return arr.reduce(function(accum, object) {
if (key in object) accum.push(object[key]);
return accum;
}, []);
}
console.log(extractValue([{name: 'bob'}, {name: 'jim'}, {name: 'sarah'}, {age: 100}], 'name'));