Использование метода reduce для извлечения информации из объекта

#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'));