Большинство ответов здесь сосредоточены на использовании Array.filter()
или Array.reduce()
(который, я считаю, является наиболее подходящим подходом).Но я хотел бы указать, как изменить вашу «неправильную попытку», чтобы она действительно работала.Вот несколько шагов, которые я предпринял, чтобы исправить это:
- Удалить петлю пропеллера. Здесь вам нужно только свойство
age
, поэтому нет необходимости проверять другиереквизит.(prop[obj]
на самом деле в обратном направлении, в любом случае. Это должно быть obj[prop]
) - Переместить
return count;
вне внешней петли for
. - Замените
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));
... и, наконец, еще несколько предложений, которые могут не соответствовать вашим текущим критериям, но которые важно знать ради читабельности / ремонтопригодности в будущем.усилия (особенно для больших баз кода):
- Я вижу, вы используете
let
в вашем примере, что означает, что у вас есть доступ к const
.Я бы посоветовал вам использовать const
вместо let
как можно больше .Кроме того, поскольку const
и let
работают не так, как var
( block-scoping ), я бы прекратил использовать var
полностью, чтобы избежать путаницы.const
также может использоваться для функций, чтобы предотвратить их замену. - Следование последовательному стилю кодирования также помогает с удобочитаемостью с течением времени.Если вы не знаете о них, особенно полезны руководства по стилю, такие как Standard или Airbnb , поскольку они указывают на аргументацию и дополнительные инструменты, которые вы можете использовать для обеспечения соблюдения этих правил.(Моя точка зрения на
const
изначально пришла от Airbnb, например) - Как рекомендуется в парадигме функционального программирования, неизменность также важна .Даже если у нас нет доступа к неизменяемым в JS (без помощи библиотек или, по крайней мере,
Object.freeze()
), простое отношение к значениям как к неизменным, как к привычке, имеет те же преимущества - и const
часто дает вам половинупрепятствуя повторному назначению. - Именование сложно, но стоит усилий.Например,
person
будет более информативным, чем obj
.Также correctAge
не достаточно описательный сам по себе - вы не знаете, что такое «правильный возраст», не найдя функцию и не посмотрев на ее определение.Это не проблема для этого примера, потому что он небольшой, но, как и остальные предложения, лучше создавать полезные привычки на небольших примерах, подобных этому, чтобы вам не приходилось думать об этом позже. - При использовании массивов / итерируемых методов, я думаю, что лучше определять обратный вызов, а не оболочку массива.Это делает функции более компонуемыми - то есть вы можете легко смешивать / сопоставлять их.
..., что приводит к моему последнему фрагменту:
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
)