Как мне подсчитать количество объектов с определенным значением из множества вложенных объектов?

#javascript #jquery

#javascript #jquery

Вопрос:

 var foodwebsites = {
  "bacon": [{
    "url": "stackoverflow.com",
  }],
  "icecream": [{
    "url": "example.com",
  }],
  "cheese": [{
    "url": "example.com",
  }]
}

var baconfoodwebsites = foodwebsites.bacon.filter(function(elem) {
  return elem.url == 'example.com';
}).length;

var icecreamfoodwebsites = foodwebsites.icecream.filter(function(elem) {
  return elem.url == 'example.com';
}).length;

var cheesefoodwebsites = foodwebsites.cheese.filter(function(elem) {
  return elem.url == 'example.com';
}).length;

var allfoodwebsites = baconfoodwebsites   icecreamfoodwebsites   cheesefoodwebsites;

console.log(baconfoodwebsites, icecreamfoodwebsites, cheesefoodwebsites, allfoodwebsites)  

Я хотел бы сделать то же самое без повторения всех этих отдельных вложенных объектов (бекон, мороженое и сыр).

Я предполагаю, что ответ будет таким:

 var allfoodwebsites = foodwebsites=.filter(function( elem) {
    return elem.url == 'example.com';
}).length;
  

Дополнительная информация:

Я бы хотел использовать только jQuery чистый Javascript, если это возможно.

Я хотел бы найти все вложенные объекты с "url": "example.com"

Комментарии:

1. Здесь не было JSON. У вас есть POJOs — простые старые объекты JavaScript

2. Не используйте фильтр для подсчета. Вы создаете ненужный массив в памяти.

3. Пожалуйста, уточните с ожидаемым результатом, что вам нужно подсчитать? Все доступные URL-адреса? Количество URL-адресов, соответствующих некоторому шаблону?

Ответ №1:

Используя Object.values, Array#reduce() и Array#flat() . Обратите внимание, что в некоторых средах flat() может потребоваться полизаполнение

 let foodwebsites = {"bacon": [{"url": "stackoverflow.com",}],"icecream": [{"url": "example.com",}],"cheese": [{"url": "example.com",}]};


const  getUrlCount = (url) => {
   return Object.values(foodwebsites)
       .flat()
       .reduce((a, {url:u})=> a   (url === u) , 0)

}

console.log(getUrlCount("example.com"))  

Комментарии:

1. a ? почему не просто a 1 ? Или даже a (url === u) ?

2. @JonasWilms никогда не был обусловлен использованием подобных логических значений. Простой ярлык

Ответ №2:

Лучшим вариантом является функция reduce для подсчета подходов.

 let foodwebsites = {"bacon": [{"url": "stackoverflow.com",}],"icecream": [{"url": "example.com",}],"cheese": [{"url": "example.com",}]};
let allfoodwebsites = Object.values(foodwebsites).
          reduce((a, array) => a   array.
            reduce((a, {url}) => a   (url === "example.com"), 0), 0);

console.log(allfoodwebsites);  

Ответ №3:

Решение:

Вы можете создать функцию, которая будет перебирать ключи объектов и искать property и value внутри массива дочерних объектов каждого доступного ключа:

 let amount = (p, v, i = 0) => 
(Object.keys(foodwebsites).forEach(k => foodwebsites[k].forEach(o => o[p] === v amp;amp; i  ))
, i);
  

и его можно использовать следующим образом:

 amount("url", "example.com"); // 2
  

Рабочий фрагмент кода:

 var foodwebsites = {
  "bacon": [{
    "url": "stackoverflow.com",
  }],
  "icecream": [{
    "url": "example.com",
  }],
  "cheese": [{
    "url": "example.com",
  }]
}

    let amount = (p, v, i = 0) => 
    (Object.keys(foodwebsites).forEach(k => foodwebsites[k].forEach(o => o[p] === v amp;amp; i  ))
    , i);

console.log(
  amount("url", "example.com")
);
//2  

Комментарии:

1. Так ли это let amount = amount("url", "example.com"); ?

2. @Tigerrrrr да.

Ответ №4:

На самом деле я создал один массив из всех этих вложенных записей:

   const sites = Object.values(foodwebsites).flat();
  

Затем вы можете легко выполнить итерацию по нему и посчитать все ключи:

  const count = (arr, key, value) => arr.reduce((acc, it) => acc   it[key] === value, 0);

 console.log(
   count(sites, "url", "example.com"),
   count(sites, "url", "stackoverflow.com")
 );
  

Комментарии:

1. @mplungjan на мобильном устройстве.

2. @mplungjan вы правы с опечаткой, но, конечно, я могу

3. Мой плохой. Пропустил это во второй раз