#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. Мой плохой. Пропустил это во второй раз