Найти свойство (которое хранится в виде строки в переменной) в массиве объектов - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть массив объектов, в которых хранятся данные разных «учеников».

var pupils = [
{
    id: 0,
    name: 'will'
},
{
    id: 1,
    name: 'megan'
}
];

Я хочу создать функцию под названием «findPupil», которая принимает три параметра: свойство, которое вы знаете, значениеВы знаете, что это так и собственность, которую хотите найти.

Скажем, вы знаете, что искомый ученик имеет идентификатор 1, но вы не знаете его имени.В этом случае вы бы вызвали функцию следующим образом:

var name = findPupil('id', 1, 'name'); // should now store 'Megan' as a string

Вот функция, которую я написал:

function findPupil(property, value, find) {
pupils.forEach(function(pupil) {
    if(pupils[pupil][`${property}`] === value) {
      return pupils[pupil][`${find}`];
    }
  });
}

Вызов этой функции возвращает следующее:

Error: Cannot read property 'id' of undefined

Как мне заставить эту функцию работать?

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019
    var pupils = [
    { id: 0, name: 'will' },
    { id: 1, name: 'megan' }
];

function findPupil(property, value, find) {
    var find_value = '';
    for (var i = 0; i < pupils.length; i++) {
        if (find_value == '') {
            Object.keys(pupils[i]).forEach(function (key) {
                if (key == property && pupils[i][key] == value) {
                    find_value = pupils[i][find];
                }
            });
        } else {
            break;
        }
    }
    console.log(find_value);
    return find_value;
}

var name = findPupil('id', 1, 'name');
0 голосов
/ 20 февраля 2019

Для этого вы можете использовать .find().

var pupils = [{id: 0, name: 'will'},{id: 1,name: 'megan'}];

function getByPropertyAndValue(knownProp, knownValue, desiredProperty) {
  let pupil = pupils.find(p => p[knownProp] === knownValue); //Find pupil by property and value
  return pupil && pupil[desiredProperty]; //Return the value, or undefined if not found
}

console.log(getByPropertyAndValue("id", 1, "name"));
0 голосов
/ 20 февраля 2019

Большая часть вашего кода верна, за исключением части вашего заявления if.Пожалуйста, найдите рабочий пример -

var pupils = [{
    id: 0,
    name: 'will'
  },
  {
    id: 1,
    name: 'megan'
  }
];

function findPupil(property, value, find) {
  let result
  pupils.forEach(function(pupil) {
    if (pupil[property] === value) {
      result = pupil[find];
    }
  });
  return result
}

var name = findPupil('id', 1, 'name');

console.log(name)
0 голосов
/ 20 февраля 2019

Используйте Array.find(), чтобы найти объект с известным вам свойством, или по умолчанию, если объект не найден.Извлеките свойство find из объекта:

const pupils = [{"id":0,"name":"will"},{"id":1,"name":"megan"}];

const findPupil = (property, value, find) =>
  (pupils.find(o => o[property] === value) || {})[find];

const name = findPupil('id', 1, 'name');

console.log(name);
...