L oop объекты в массиве Javascript и подсчет подобных объектов - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь выполнить l oop через массив объектов и получить число похожих значений для определенного ключа, когда выполняются определенные условия. Сначала я попытался зациклить один массив (хранилище), но потом понял, что условия должны быть динамическими c. Их нет сейчас. Я вошел в HR и Food, но в идеале хотел бы сделать эти переменные. Таким образом, я зацикливаю значения в массиве C и проверяю данные в хранилище. Если я l oop один раз (имею только одно значение в массиве C), он работает, но более того, он зацикливается слишком много раз и дает мне неправильный вывод. Попытка получить количество всех похожих наградных свойств, так как они соотносятся с данными и обслуживанием. Например, все объекты с данными: «HR» и Service: «Food» будут объединены для отражения: {data: HR, service: Food, DDR: 3}

Код:

var arrayC = ["DDM","DDR"]; 
        var storage =  [
        { data: 'CT', service: 'Food',award: 'DDM' },
        { data: 'HR', service: 'Food',award: 'DDM' },
        { data: 'HR', service: 'Food',award: 'DDR' },
        { data: 'HR', service: 'Food',award: 'DDR' },
        { data: 'HR', service: 'Food',award: 'DDR' }
        ];
    
    var array1=[];
    var arrayTest = [];
    var jk ={};
    
    function getIt () {
    arrayC.forEach(function(key,value){
     
      $.each(storage, function(k,x){
       // console.log(v.award);
        if(key==x.award&&x.data=="HR"&&x.service=="Food"){
          jk[x.award] = jk.hasOwnProperty(x.award) ? arrayTest.push(x.award) : arrayTest.push(x.award), 
          jk.data = x.data,
          jk.service = x.service
          
        } 
      }); //inside each  
    });
      //array1.push(jk); 
      return jk;
    }
    
    var newThing = getIt();
    console.log(newThing);

    //Output: 
    //Object {
     // data: "HR",
     // DDM: 1,
     // DDR: 4,
     // service: "Food"
    //}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Ответы [ 2 ]

1 голос
/ 19 марта 2020

В качестве ключа для подсчета вы можете использовать строку и комбинацию данных и комбинаций услуг.

var storage = [
    { data: 'CT', service: 'Food', award: 'DDM' },
    { data: 'HR', service: 'Food', award: 'DDM' },
    { data: 'HR', service: 'Food', award: 'DDR' },
    { data: 'HR', service: 'Food', award: 'DDR' },
    { data: 'HR', service: 'Food', award: 'DDR' }
];

var res = storage.reduce(function (x, cur) {
    let item = cur.data + cur.award
    if (!x[item]) x[item] = 0;
    x[item] = x[item] + 1
    return x
}, {})
var results = []

for (const key in res) {
    const count = res[key];
    const data = key.slice(0, 2)
    const service = key.slice(2)
    results.push({
        data: data,
        service: service,
        count: count
    })
}
console.log(results)
1 голос
/ 19 марта 2020

Вы можете создать вложенный объект с количеством необходимых ключей.

var storage =  [{ data: 'CT', service: 'Food',award: 'DDM' }, { data: 'HR', service: 'Food',award: 'DDM' }, { data: 'HR', service: 'Food',award: 'DDR' }, { data: 'HR', service: 'Food',award: 'DDR' }, { data: 'HR', service: 'Food',award: 'DDR' }],
    keys = ['data', 'service', 'award'],
    counts = storage.reduce(function (r, o) {
        var last = o[keys[keys.length - 1]],
            reference = keys
                .slice(0, -1)
                .reduce(function (q, k) { return q[o[k]] = q[o[k]] || {}; }, r);
        reference[last] = (reference[last] || 0) + 1;
        return r;
    }, {});

console.log(counts);
...