Количество Javascript между 2 массивами

#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);
  

https://jsfiddle.net/Law7rzc2/

Ответ №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
  }
]