Рамда о массивах в JavaScript

1

  var censusMembers = Object.freeze([
    {
    id: 1,
    name: 'Bob'
    }, {
    id: 2,
    name: 'Sue'
    }, {
    id: 3,
    name: 'Mary',
    household_id: 2
    }, {
    id: 4,
    name: 'Elizabeth',
    household_id: 6
    }, {
    id: 5,
    name: 'Tom'
    }, {
    id: 6,
    name: 'Jill'
    }, {
    id: 7,
    name: 'John',
    household_id: 6
    }
    ]);

Это мой массив. Я хочу подсчитать количество элементов, которые имеют домашний идентификатор, используя функцию ramda? Как я могу это сделать?

  • 0
    Почему Рамда? это возможно, используя ванильный JS.
  • 0
    Я изучаю рамду, не могли бы вы помочь с помощью рамды?
Показать ещё 3 комментария
Теги:
arrays
ramda.js

4 ответа

1

Вы можете также использовать R.countBy сосчитать все элементы, которые имеют/не household_id с помощью R.has(), и чем получить счетчик для true используя R.prop():

const { pipe, countBy, has, prop } = R;

const censusMembers = Object.freeze([{"id":1,"name":"Bob"},{"id":2,"name":"Sue"},{"id":3,"name":"Mary","household_id":2},{"id":4,"name":"Elizabeth","household_id":6},{"id":5,"name":"Tom"},{"id":6,"name":"Jill"},{"id":7,"name":"John","household_id":6}]);

const countHouseholders = pipe(
  countBy(has('household_id')),
  prop('true'),
);

const result = countHouseholders(censusMembers);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
0

Я не знаю ramda, поэтому я не буду догадываться, но в ванили (и много функциональности):

censusMembers.filter((m) => { return m.hasOwnProperty('household_id') })
  • 1
    Вы, вероятно, хотите length после этого, так как запрос был для подсчета.
0

has выглядит то, что вам не хватает:

var censusMembers = Object.freeze([
  {id: 1, name: 'Bob'}, 
  {id: 2, name: 'Sue' }, 
  {id: 3, name: 'Mary', household_id: 2 }, 
  {id: 4, name: 'Elizabeth', household_id: 6},
  {id: 5, name: 'Tom'}, 
  {id: 6, name: 'Jill'}, 
  {id: 7, name: 'John', household_id: 6}
]);

const countHouseholders = R.pipe(R.filter(R.has('household_id')), R.length)

console.log(countHouseholders(censusMembers))
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
  • 0
    Как найти количество элементов, у которых нет домашнего хозяйства?
  • 0
    Вы можете заменить filter , reject указано выше, или обернуть has('household_id') в complement . Либо должно работать.
Показать ещё 6 комментариев
0

Не используйте filter функций для подсчета материала, потому что вы создаете массив только для получения длины.

Вы можете использовать функцию R.reduce и в обработчике, проверьте для ключа household_id

var censusMembers = Object.freeze([{id: 1,name: 'Bob'}, {id: 2,name: 'Sue'}, {id: 3,name: 'Mary',household_id: 2}, {id: 4,name: 'Elizabeth',household_id: 6}, {id: 5,name: 'Tom'}, {id: 6,name: 'Jill'}, {id: 7,name: 'John',household_id: 6}]);

// With household_id
//                                      (true is coerced to 1) = 1
console.log("With:", R.reduce((a, c) => ('household_id' in c) + a, 0, censusMembers));

// Without household_id
//                                         !(false is coerced to 0) = 1
console.log("Without:", R.reduce((a, c) => !('household_id' in c) + a, 0, censusMembers));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
  • 0
    Существует мало причин, чтобы познакомить Ramda с решением, которое прекрасно работает без него. ( censusMembers.reduce(fn, 0) и R.reduce(fn, 0, censusMembers) .) Ramda занимается созданием и составлением функций. Я знаю, что это учебное упражнение для ОП, но Рамда не является заменой Подчеркивания / Лодаша; это должно облегчить написание FP на JS.
  • 0
    @ScottSauyet по какой-то причине эта функция доступна в Ramda.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню