Функция JavaScript - подсчитать вхождения значения в массив объектов - PullRequest
1 голос
/ 19 сентября 2019

Мне дали задание, и я, должно быть, что-то упустил.Приведенный код не является оригинальным вопросом, но похож.Я должен посчитать, сколько людей в массиве в возрасте 16 лет и старше.Я играл с этим, и я не могу решить это.Пожалуйста, кто-нибудь может объяснить, что я делаю неправильно?

В задании мне дан массив объектов:

var people = [{name:'Emma', age:15},{name:'Matt', age: 16}, {name:'Janet', age:17}]

Мне нужно выполнить функцию, чтобы подсчитать, сколько людейв возрасте 16 лет и старше.Дано начало функции (т.е. function correctAge(people){ //Complete })

«Пример кода» - это некоторый скелетный код, с которым я играл.«Неверная попытка» - это моя попытка, которая представляет собой код, к которому я все время возвращаюсь, или вариант которого также является правильным ...

Пожалуйста, помогите

Неправильная попытка:

var people = [
  {name: "Emma", age: 15},
  {name: "Matt", age: 16},
  {name: "Tom", age: 17}
];

function correctAge(array) {
  // Complete the function to return how many people are age 16+
  var count = 0;

  for (let i = 0; i < array.length; i++) {
    var obj = array.length[i];
    for (prop in obj) {
      if (prop[obj] >= 16) {
        count++;
      }
    }
    return count;
  }
}

console.log(correctAge(people));

Пример кода:

var people = [
  {name: "Emma", age: 15},
  {name: "Matt", age: 16},
  {name: "Tom", age: 17}
];

function correctAge(people) {
  // Complete the function to return how many people are age 16+
}

Ответы [ 7 ]

0 голосов
/ 21 сентября 2019

Array.reduce () - это элегантное решение для этого -

function correctAge(array) {
  return array.reduce((total, person) => {
      return person.age >= 16 ? ++total : total;
    }, 0)
}

Для примера в вопросе возвращается значение 2.

0 голосов
/ 21 сентября 2019

Большинство ответов здесь сосредоточены на использовании Array.filter() или Array.reduce() (который, я считаю, является наиболее подходящим подходом).Но я хотел бы указать, как изменить вашу «неправильную попытку», чтобы она действительно работала.Вот несколько шагов, которые я предпринял, чтобы исправить это:

  1. Удалить петлю пропеллера. Здесь вам нужно только свойство age, поэтому нет необходимости проверять другиереквизит.(prop[obj] на самом деле в обратном направлении, в любом случае. Это должно быть obj[prop])
  2. Переместить return count; вне внешней петли for.
  3. Замените array.length[i] на array[i]. Свойство массива .length является целым числом, а не массивом или объектом.

var people = [
  {name: "Emma", age: 15},
  {name: "Matt", age: 16},
  {name: "Tom", age: 17}
];

function correctAge(people) {
  // Complete the function to return how many people are age 16+
  var count = 0;

  for (let i = 0; i < people.length; i++) {
    var obj = people[i]; // <-- instead of array.length[i]
    if (obj.age >= 16) { // <-- obj.age instead of obj[prop]
      count++;
    }
  }
  return count; // <-- moved outside the loop
}

console.log(correctAge(people));

Теперь снова, но с использованием Array.reduce(), который является отличным инструментом для агрегирования:

var people = [
  {name: "Emma", age: 15},
  {name: "Matt", age: 16},
  {name: "Tom", age: 17}
];

function correctAge(people) {
  // start at 0, then add 1 when obj.age >= 16, 0 otherwise
  return people.reduce(
    (acc, obj) => acc + (obj.age >= 16 ? 1 : 0), 0
  );
}

console.log(correctAge(people));

Array.filter() - самый читаемый метод, imo:

var people = [
  {name: "Emma", age: 15},
  {name: "Matt", age: 16},
  {name: "Tom", age: 17}
];

function correctAge(people) {
  return people.filter(obj => obj.age >= 16).length;
}

console.log(correctAge(people));

... и, наконец, еще несколько предложений, которые могут не соответствовать вашим текущим критериям, но которые важно знать ради читабельности / ремонтопригодности в будущем.усилия (особенно для больших баз кода):

  1. Я вижу, вы используете let в вашем примере, что означает, что у вас есть доступ к const.Я бы посоветовал вам использовать const вместо let как можно больше .Кроме того, поскольку const и let работают не так, как var ( block-scoping ), я бы прекратил использовать var полностью, чтобы избежать путаницы.const также может использоваться для функций, чтобы предотвратить их замену.
  2. Следование последовательному стилю кодирования также помогает с удобочитаемостью с течением времени.Если вы не знаете о них, особенно полезны руководства по стилю, такие как Standard или Airbnb , поскольку они указывают на аргументацию и дополнительные инструменты, которые вы можете использовать для обеспечения соблюдения этих правил.(Моя точка зрения на const изначально пришла от Airbnb, например)
  3. Как рекомендуется в парадигме функционального программирования, неизменность также важна .Даже если у нас нет доступа к неизменяемым в JS (без помощи библиотек или, по крайней мере, Object.freeze()), простое отношение к значениям как к неизменным, как к привычке, имеет те же преимущества - и const часто дает вам половинупрепятствуя повторному назначению.
  4. Именование сложно, но стоит усилий.Например, person будет более информативным, чем obj.Также correctAge не достаточно описательный сам по себе - вы не знаете, что такое «правильный возраст», не найдя функцию и не посмотрев на ее определение.Это не проблема для этого примера, потому что он небольшой, но, как и остальные предложения, лучше создавать полезные привычки на небольших примерах, подобных этому, чтобы вам не приходилось думать об этом позже.
  5. При использовании массивов / итерируемых методов, я думаю, что лучше определять обратный вызов, а не оболочку массива.Это делает функции более компонуемыми - то есть вы можете легко смешивать / сопоставлять их.

..., что приводит к моему последнему фрагменту:

const people = [
  {name: 'Matt', age: 15},
  {name: 'Emma', age: 15},
  {name: 'Matt', age: 16},
  {name: 'Tom', age: 17},
  {name: 'Matt', age: 37}
]

const personHasName = (name, person) => person.name === name
const personIsOfAge = (age, person) => person.age >= age

// Composition of personHasName and personIsOfAge
const mattsOver16 = person =>
    personHasName('Matt', person) && personIsOfAge(16, person)

console.log(
  people.filter(mattsOver16).length
)
0 голосов
/ 19 сентября 2019

Попробуйте, вы получите свой результат;

var people = [{name:'Emma', age:15},{name:'Matt', age: 16}, {name:'Janet', age:17}];

const correctAge = function(age) {
 return people.filter(x => x.age < age).length;
}

console.log(correctAge(16));
0 голосов
/ 19 сентября 2019

Итерируйте по вашему массиву, проверьте свойство элемента, соответствует параметру и увеличьте счетчик.

Пример кода ниже, имена и свойства были изменены, чтобы защитить невинных.

const cars = [
  { make: 'Nissan', country: 'Japan' },
  { make: 'Ford', country: 'USA' },
  { make: 'Chevy', country: 'USA' },
  { make: 'Volvo', country: 'Sweden' },
  { make: 'Mitsubishi', country: 'Japan' },
];

function fromCountry(cars, country) {
  let count = 0;
  for(let i = 0; i < cars.length; i++) {
    if (cars[i].country === country) {
      count++;
    }
  }
  return count;
}

const fromCountry2 = (cars, country) => cars.reduce((count, car) => {
  car.country === country && count++;
  return count;
}, 0);

console.log(fromCountry(cars, 'Japan')); // 2
console.log(fromCountry(cars, 'Sweden')); // 1
console.log(fromCountry(cars, 'USA')); // 2
console.log(fromCountry(cars, 'Canada')); // 0

console.log(fromCountry2(cars, 'Japan')); // 2
console.log(fromCountry2(cars, 'Sweden')); // 1
console.log(fromCountry2(cars, 'USA')); // 2
console.log(fromCountry2(cars, 'Canada')); // 0
0 голосов
/ 19 сентября 2019
people.filter(x=>{return x.age>=16}).length;

Добавьте указанную выше строку кода в вашу функцию.

0 голосов
/ 19 сентября 2019

Было бы намного проще использовать метод массива filter:

function correctAge(people = [], age = 16){

    return people.filter( person => person.age > age ).length
}
0 голосов
/ 19 сентября 2019

Вам нужно взять объект, используя индекс.

obj = array[i];

Затем вы можете получить свойство напрямую, не зацикливая все свойства.

if (obj.age >= 16) {
    count++;
}

Вы можете поставитьобе части в одну проверку, без использования другой переменной obj.

if (array[i].age >= 16) {
    count++;
}

.age является средством доступа к свойству объекта.

{
    name: 'Emma',
    age: 15       // <--
}

Если вам нравится однострочный подход, вы можете уменьшить массив и сосчитать вхождения.

return array.reduce((count, { age }) => count + (age >= 16), 0);
...