как я могу увеличить переменную в зависимости от количества объектов proprety

#javascript #arrays #for-loop #object

Вопрос:

У меня есть список отделов, я пытаюсь подсчитать, сколько отделов существует для каждого из них, и увеличить переменную (например i ), чтобы я мог вызвать ее вне цикла и повлиять на нее как на ярлык для каждого отдела.

Я начал с этого, но это не работает :

 import publicationTotal from "../data/agora-export-publicationtotal-20210803164942.json";

let stringified, myObj, subkeys;
stringified = JSON.stringify(publicationTotal);
myObj = JSON.parse(stringified);
subkeys = Object.keys(myObj[0]);

let departement= {};
let star = [];
for (let x in myObj) {
  if (Object.prototype.hasOwnProperty.call(myObj, x)) {
    for (let y in subkeys) {
      if (Object.prototype.hasOwnProperty.call(subkeys, y)) {
        if (subkeys[y] === "Departement") {
          //  star = myObj[x][subkeys[y]]   1;
            star = departement[ myObj[x][subkeys[y]] ] = departement[ myObj[x][subkeys[y]] ]   1;
          console.log("dept : ", star);
           
        }
      }
    }

  }
}
 

файл publicationTotal содержит такую информацию :

 [
  {
    "num_dep": "AI",
    "dep_name": "Ain",
    "region_name": "Auvergne-Rhône-Alpes",
    "total_parrainages": 0,
    "color_dpt": ""
  },
  {
    "num_dep": "AI",
    "dep_name": "Ain",
    "region_name": "Hauts-de-France",
    "total_parrainages": 0,
    "color_dpt": ""
  },
  {
    "num_dep": "AM",
    "dep_name": "Alpes-Maritimes",
    "region_name": "Auvergne-Rhône-Alpes",
    "total_parrainages": 0,
    "color_dpt": ""
  },
  {
    "num_dep": "AM",
    "dep_name": "Alpes-Maritimes",
    "region_name": "Provence-Alpes-Côte d'Azur",
    "total_parrainages": 0,
    "color_dpt": ""
  },
  {
    "num_dep": "AM",
    "dep_name": "Alpes-Maritimes",
    "region_name": "Provence-Alpes-Côte d'Azur",
    "total_parrainages": 0,
    "color_dpt": ""
  },
  {
    "num_dep": "AM",
    "dep_name": "Alpes-Maritimes",
    "region_name": "Provence-Alpes-Côte d'Azur",
    "total_parrainages": 0,
    "color_dpt": ""
  },
  {
    "num_dep": "AG",
    "dep_name": "Ariège",
    "region_name": "Auvergne-Rhône-Alpes",
    "total_parrainages": 0,
    "color_dpt": ""
  },
  {
    "num_dep": "AG",
    "dep_name": "Ariège",
    "region_name": "Grand Est",
    "total_parrainages": 0,
    "color_dpt": ""
  },
  {
    "num_dep": "AG",
    "dep_name": "Ariège",
    "region_name": "Occitanie",
    "total_parrainages": 0,
    "color_dpt": ""
  },
  {
    "num_dep": "AB",
    "dep_name": "Aube",
    "region_name": "Grand Est",
    "total_parrainages": 0,
    "color_dpt": ""
  },
  {
    "num_dep": "AD",
    "dep_name": "Aude",
    "region_name": "Occitanie",
    "total_parrainages": 0,
    "color_dpt": ""
  }
]
 

Например, i переменная будет иметь 4 для департамента «Йонна» и 3 для департамента «Валь-де-Марн».

Ожидаемый результат-название отдела и номер отдельно, чтобы я мог звонить им, куда захочу

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

1. Поделитесь ожидаемым результатом в своем вопросе.

2. Каков ожидаемый результат?

3. @navnath, Нитиш, я обновил свой пост

4. @MeryemACHEMLAL-это объект или массив. Два ответа, добавленные здесь, показывают результат в виде объекта. Какие изменения вы ожидаете в ответах на вопросы?

5. мне просто нужно сохранить пример, который я поместил в свой пост, и иметь название отделения и номер отдельно, я имею в виду две переменные, если это возможно

Ответ №1:

 const publicationTotal=[{Departement:"Yonne"},{Departement:"Yonne"},{Departement:"Yonne"},{Departement:"Yonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Seine-Saint-Denis"},{Departement:"Seine-Saint-Denis"},{Departement:"Seine-Saint-Denis"},{Departement:"Seine-Saint-Denis"},{Departement:"Val-de-Marne"},{Departement:"Val-de-Marne"},{Departement:"Val-de-Marne"},{Departement:"Val-d'Oise"}];

let results = {};

publicationTotal.forEach(({
  Departement
}) => {
  if (results[Departement] === undefined) {
    results[Departement] = 0
  } else {
    results[Departement] = results[Departement]   1
  }
})

console.log(results) 

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

1. спасибо @ksav за ваш комментарий 🙂 , как я могу получить название отдела и номер отдельно, потому что в результате у меня есть это : Йонне: 62

2. Я не совсем понимаю, что вы имеете в виду get the name and number separately

Ответ №2:

если отдел уже уходит? получите его и увеличьте на 1, иначе установите 1

 const departments = [{"Departement":"Yonne"},{"Departement":"Yonne"},{"Departement":"Yonne"},{"Departement":"Yonne"},{"Departement":"Essonne"},{"Departement":"Essonne"},{"Departement":"Essonne"},{"Departement":"Essonne"},{"Departement":"Essonne"},{"Departement":"Essonne"},{"Departement":"Essonne"},{"Departement":"Essonne"},{"Departement":"Seine-Saint-Denis"},{"Departement":"Seine-Saint-Denis"},{"Departement":"Seine-Saint-Denis"},{"Departement":"Seine-Saint-Denis"},{"Departement":"Val-de-Marne"},{"Departement":"Val-de-Marne"},{"Departement":"Val-de-Marne"},{"Departement":"Val-du0027Oise"}];

const result = departments.reduce((acc, item) => (
  acc[item['Departement']] =acc[item['Departement']]
  ?
  acc[item['Departement']]   1
  :
  1,
  acc),{}
);

console.log(result);

// to get only department names
console.log("departments: ", Object.keys(result));

// to get only no of depatment
console.log("department values: ", Object.values(result)); 

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

1. спасибо, в вашем результате есть ошибка, я думаю, нет ?

2. Что это? Я так не думаю

3. последний консольный журнал выдает ошибку, в чем разница между ним и вторым ? Uncaught TypeError: Object.Keys is not a function

4. Я там набрал ошибку, последняя консоль выдаст вам только массив подсчетов всех отделов, если вы хотите получить результат от result just do result[deparymentName] , он даст вам подсчет. Я не понял, что вы подразумеваете под другой переменной, result достаточно для выполнения любой операции.

Ответ №3:

Array.reduce использовать имя в качестве ключа и считать значением

 const publicationTotal  = [{Departement:"Yonne"},{Departement:"Yonne"},{Departement:"Yonne"},{Departement:"Yonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Essonne"},{Departement:"Seine-Saint-Denis"},{Departement:"Seine-Saint-Denis"},{Departement:"Seine-Saint-Denis"},{Departement:"Seine-Saint-Denis"},{Departement:"Val-de-Marne"},{Departement:"Val-de-Marne"},{Departement:"Val-de-Marne"},{Departement:"Val-d'Oise"}];
const output = publicationTotal.reduce((acc, curr) => {
  acc[curr.Departement] ? acc[curr.Departement]   : acc[curr.Departement] = 1;
  return acc;
}, {});
console.log(output); 

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

1. вам не кажется, что это тяжело, когда у нас есть файл с 2000 отделами или более для каждого из них ?

2. @MeryemACHEMLAL В любом случае вам нужно выполнить цикл, чтобы разделить результат