我在线上课,其中一个挑战是:
编写一个名为extractKey的函数,它接受两个参数,一个对象数组和一个键的名称,并返回一个只包含该键值的数组:你必须使用reduce。
extractKey([{name: "Elie", isInstructor:true},{name: "Tim", isInstructor:true},{name: "Matt", isInstructor:true}], "name");
// ["Elie", "Tim", "Matt"]
我以为我可以这样做:
function extractKey(arr, key) {
arr.reduce(function(a, b) {
console.log(a.push(b[key]))
}, [])
}
但它返回1.我有一个大概的想法将每个值推入空数组,但是当控制台记录每个值时,a将在下一个累加器返回undefined。
答案 0 :(得分:1)
如果你必须使用reduce,那么我会将它与concat结合使用。
var arr = [{
name: "Elie",
isInstructor: true
}, {
name: "Tim",
isInstructor: true
}, {
name: "Matt",
isInstructor: true
}]
function extractKeys(array, key) {
return array.reduce((acc, obj) => {
return acc.concat(obj[key])
}, [])
}
console.log(extractKeys(arr, 'name'))
答案 1 :(得分:0)
如果你使用reduce(这里不是必需的),你需要传递累加器:
function extractKey(arr, key) {
arr.reduce(function(acc, el) {
console.log(a.push(el[key]))
return acc; // <--
}, [])
}
另外,一个好的旧循环可能更容易理解:
function extractKey(arr, key){
const result = [];
for(const el of arr)
result.push(el[key]);
return result;
}
最后你也可以使用 map 代替curry来美化它:
const extract = key => obj => obj[key];
const result = original.map(extract("name"));
答案 2 :(得分:0)
你非常接近但是在减少后你必须在每次回调迭代后返回值,因为只保存了累加器的值
function extractKey(arr, key) {
arr.reduce(function(a, b) {
a.push(b[key])
console.log(a)
return a;
}, []);
}