Как обойти объект из двух массивов как следующий вывод в JavaScript - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть два объекта массивов, я хочу обработать его следующим образом:

var parts={"Glenn": [12,22,32],
"Ryan": [13,23,33],
"Steve K": [14],
"Jerom":[15,25,35],
};

var labor={
"Glenn": [12,22,32],
"Ryan": [13,23,33],
"Steve K": [14],
"Nike":[16,26,36]
};

//Target output   
[{person:"Glenn",count:6},
{person:"Ryan",count:6},
{person:"Steve K",count:2},
{person:"Jerom",count:3},
{person:"Nike",count:3}
];

Здесь count означает длину массива по отношению к ключу, а person - это ключ. Если ключи совпадают, добавьте их длина массива и присвоение ему количества и ключа отображаются как персона, если нет совпадения, просто скопируйте его в новый массив. Пожалуйста, помогите мне, как достичь вышеупомянутых объектов массива

Ответы [ 4 ]

2 голосов
/ 02 апреля 2020

Объедините два массива и уменьшите их.

Это должно работать:

var parts = {
  "Glenn": [12, 22, 32],
  "Ryan": [13, 23, 33],
  "Steve K": [14],
  "Jerom": [15, 25, 35],
};

var labor = {
  "Glenn": [12, 22, 32],
  "Ryan": [13, 23, 33],
  "Steve K": [14],
  "Nike": [16, 26, 36]
};

const combined = [...Object.entries(parts), ...Object.entries(labor)];
const result = combined.reduce((res, curr) => {
  const existing = res.find(e => e.person === curr[0]);
  if (existing) {
    existing.count += curr[1].length;
  } else {
    res.push({
      person: curr[0],
      count: curr[1].length
    })
  }
  return res;
}, []);
1 голос
/ 02 апреля 2020

Вы можете создать набор всех уникальных ключей из обоих объектов, а затем выполнить итерацию по этому набору, создав объект результата из длин соответствующих элементов из parts и labor объекта:

var parts = {
  "Glenn": [12, 22, 32],
  "Ryan": [13, 23, 33],
  "Steve K": [14],
  "Jerom": [15, 25, 35],
};

var labor = {
  "Glenn": [12, 22, 32],
  "Ryan": [13, 23, 33],
  "Steve K": [14],
  "Nike": [16, 26, 36]
};

let keys = new Set([...Object.keys(parts), ...Object.keys(labor)]);
let result = {}
keys.forEach(k => result[k] = (result[k] || 0) + (parts[k] || []).length + (labor[k] || []).length);
console.log(result);
0 голосов
/ 02 апреля 2020

Итерируйте оба массива, чтобы найти вхождения, а затем увеличьте счет

var parts = {
Glenn: [12, 22, 32],
Ryan: [13, 23, 33],
"Steve K": [14],
Jerom: [15, 25, 35]
};

var labor = {
Glenn: [12, 22, 32],
Ryan: [13, 23, 33],
"Steve K": [14],
Nike: [16, 26, 36]
};

var arr = [];
for (let [key, value] of Object.entries(parts)) {
arr.push({
    person: key,
    count: value.length
});
}
for (let [key, value] of Object.entries(labor)) {
const found = arr.find(elem => elem.person === key);
if (found) {
    found.count += value.length;
} else {
    arr.push({
        person: key,
        count: value.length
    });
}
}
console.log(arr);
0 голосов
/ 02 апреля 2020

См. Следующий код, который использует for...in l oop:

var parts = {
    Glenn: [12, 22, 32],
    Ryan: [13, 23, 33],
    "Steve K": [14],
    Jerom: [15, 25, 35]
};
var labor = {
    Glenn: [12, 22, 32],
    Ryan: [13, 23, 33],
    "Steve K": [14],
    Nike: [16, 26, 36]
};
var counts = {};
// iterate through the parts and keep count
for (let key in parts) {
    if (key in counts) {
        counts[key] += parts[key].length;
    } else {
        counts[key] = parts[key].length;
    }
}
// iterate through the labor and keep count
for (let key in labor) {
    if (key in counts) {
        counts[key] += labor[key].length;
    } else {
        counts[key] = labor[key].length;
    }
}
var res = [];
// iterate through the counts and convert to an array
for (let key in counts) {
    res.push({
        person: key,
        count: counts[key]
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...