Mam dwa obiekty tablic, chcę go przetworzyć jako następujące dane wyjściowe

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}
];

Tutaj liczba oznacza długość tablicy w odniesieniu do klucza, a osoba jest kluczem. Jeśli klucze są dopasowane, dodaj ich długość tablicy i przypisz ją do liczby, a klucz pojawi się jako osoba, jeśli nie pasuje, po prostu skopiuj go do nowej tablicy. jak osiągnąć powyższe obiekty tablicowe

-3
Sherin Green 2 kwiecień 2020, 14:45

4 odpowiedzi

Najlepsza odpowiedź

Połącz dwie tablice i zmniejsz je.

To powinno działać:

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;
}, []);
2
ritaj 2 kwiecień 2020, 11:54

Powtórz obie tablice, aby znaleźć wystąpienia, a następnie zwiększ liczbę

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
vr12 2 kwiecień 2020, 12:49

Zapoznaj się z następującym kodem, który wykorzystuje for...in pętla:

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]
    })
}
0
Aplet123 2 kwiecień 2020, 11:52

Możesz utworzyć zestaw wszystkich unikalnych kluczy z obu obiektów, a następnie iterować po tym zestawie, tworząc obiekt wynikowy na podstawie długości odpowiednich elementów z obiektu parts i 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);
1
Nick 2 kwiecień 2020, 12:03