#javascript #arrays #json
#javascript #массивы #json
Вопрос:
У меня есть 2 объекта arrays, и мне нужно подсчитать количество всех типов карт, которые у нас есть.
Первый объект содержит все идентификаторы автомобилей, а второй список содержит типы автомобилей.
Вот данные:
var arr = {
"categories": [{
"id": "100",
"name": "category name",
"car_id": "1"
}, {
"id": "192",
"name": "category name here",
"car_id": "25"
}, {
"id": "192",
"name": "category name here",
"car_id": "27"
}]
};
var arr2 = {
"cars": [{
"id": "1",
"name": "car name",
"car_id": "1",
"type": "ford"
}, {
"id": "4",
"name": "name 2",
"car_id": "25",
"type": "ford"
}, {
"id": "4",
"name": "name 2",
"car_id": "27",
"type": "fiat"
}]
};
Существует только 5 типов машин, поэтому у меня есть 5 переменных:
var:
ford,
fiat,
mazda,
mini,
mg
Итак, что мне нужно в итоге, это что-то вроде этого:
ford: 2;
fiat: 1;
mazda: 0;
mini: 0;
mg: 0;
Как я могу это сделать?
Комментарии:
1. Не существует такого понятия, как объект JSON. JSON всегда является строкой.
2. перефразировал вопрос
3. Я бы использовал цикл for in и объект с ключами в качестве имен автомобилей и значений в качестве счетчика. Я думаю, что это достаточно простая задача, вы захотите разобраться в этом сами, прежде чем полагаться на переполнение стека
4. Что означает «много типов карт»?
5. Как первый массив учитывается при вычислении?
Ответ №1:
Если количество ваших типов фиксировано, попробуйте этот подход
Сначала создайте карту
var map = {
ford: 0,
fiat: 0,
mazda: 0,
mini: 0,
mg: 0
};
Теперь повторите массивы и посчитайте по типам
arr2.cars.forEach( function( item ){
map[ item.type ] ;
});
теперь ваша карта заполнена значениями.
var arr2 = {
"cars": [{
"id": "1",
"name": "car name",
"car_id": "1",
"type": "ford"
}, {
"id": "4",
"name": "name 2",
"car_id": "25",
"type": "ford"
}, {
"id": "4",
"name": "name 2",
"car_id": "27",
"type": "fiat"
}]
};
var map = {
ford: 0,
fiat: 0,
mazda: 0,
mini: 0,
mg: 0
};
arr2.cars.forEach(function(item) {
map[item.type] ;
});
console.log(map);
Комментарии:
1. Но по определению будут и другие типы, либо сейчас, либо в будущем.
2. Поскольку OP упомянул, что существует 5 переменных, поэтому я подумал, что количество типов фиксировано. В любом случае это можно легко расширить для поддержки динамического количества типов.
Ответ №2:
var arr = {
"categories": [{
"id": "100",
"name": "category name",
"car_id": "1"
}, {
"id": "192",
"name": "category name here",
"car_id": "25"
}, {
"id": "192",
"name": "category name here",
"car_id": "27"
}]
};
var arr2 = {
"cars": [{
"id": "1",
"name": "car name",
"car_id": "1",
"type": "ford"
}, {
"id": "4",
"name": "name 2",
"car_id": "25",
"type": "ford"
}, {
"id": "4",
"name": "name 2",
"car_id": "27",
"type": "fiat"
}]
};
var carCount, typeCount;
arr.categories.forEach(function(item){
if(item.hasOwnProperty("car_id")){
carCount = arr.categories.length;
}
});
arr2.cars.forEach(function(item){
if(item.hasOwnProperty("type")){
typeCount = arr2.cars.length;
}
});
console.log(carCount);
console.log(typeCount);
Ответ №3:
Все, что вам нужно, это
countBy(arr2.cars, 'type')
Реализация countBy
оставлена в качестве упражнения.
Ответ №4:
Array.prototype.reduce — это ваш выбор для такого рода вычислений массива. Карта поможет вам отслеживать уникальные марки автомобилей по мере прохождения по массиву автомобилей.
var obj2 = {
"cars": [{
"id": "1",
"name": "car name",
"car_id": "1",
"type": "ford"
}, {
"id": "4",
"name": "name 2",
"car_id": "25",
"type": "ford"
}, {
"id": "4",
"name": "name 2",
"car_id": "27",
"type": "fiat"
}]
};
const typeStat = cars => {
let map = cars.reduce((m, {type}) =>
m.set(type, (m.get(type) || 0) 1), new Map());
return Array.from(map, ([make, count]) => ({make, count}));
};
let stats = typeStat(obj2.cars)
console.log(stats);
Вывод
[
{
"make": "ford",
"count": 2
},
{
"make": "fiat",
"count": 1
}
]