어떻게 값을 합의에 해당 키에는 개체의 배열 될 수있는 여러,새로 생성된 키?

0

질문

이 존재하는 객체의 배열과 같이 어디가'범주는'키고 일부는'시'키를 사용합니다.

arrOne = [
    {
        "series_1": 25,
        "category": "Category 1",
        "series_2": 50
    },
    {
        "series_1": 11,
        "category": "Category 2",
        "series_2": 22
    },
    {
        "series_1": 32,
        "category": "Category 1",
        "series_2": 74
    },
    {
        "series_1": 74,
        "category": "Category 3",
        "series_2": 98
    },
    {
        "series_1": 46,
        "category": "Category 3",
        "series_2": 29
    },

]

(참고로'카테고리 확인할 수 있게 되었습니다 거의 모든 값을,하지만 가능성이 있을 것을 여러 개의 유사한 값뿐만 아니라 몇 가지 독특한 값을 예를 들어 여러 개 있는 객체와 함께'category'value'카테고리 3'그러나 단지 1'category'value'카테고리 2')

다음과 같은 줄의 코드를 추가 모두 series_1 개체에 대한 동일한 카테고리

        var objForAllCategories = {};
        this.arrOne.forEach(item => {
            if (objForAllCategories.hasOwnProperty(item.category))
                objForAllCategories[item.category] = objForAllCategories[item.category] + item.series_1;
            else
                objForAllCategories[item.category] = item.series_1;
        });
        for (var prop in objForAllCategories) {
            this.allCategoriesAndValues.push({ 
                category: prop, 
                series_1: objForAllCategories[prop] 
            });
        }

그래서 그것은 결과는:

allCategoriesAndValues = [
    {
        "category": "Category 1",
        "series_1": 57       // 25 + 32 adding up series_1 from all 'Category 1' items in arrOne
    },
    {
        "category": "Category 2",
        "series_1": 11      // only 1 'Category 2' from arrOne
    },
    {
        "category": "Category 3",
        "series_1": 120     // 74 + 46 adding up series_1 from all 'Category 3' items in arrOne
    }
]

그러나고 싶어를 추가할 수 있지만 series_1 하지만 또한 다른 모든 항목입니다.

이 예제는 단지 카테고리 series_1 및 series_2 으로 키가 있습니다. 그러나,있을 수 있습니다.

  1. series_3
  2. series_4
  3. series_5
  4. series_6
  5. series_7
  6. 등등....

나는 어떻게 계정에 대한 모든 잠재적인 series_x?

의도한 결과:

allCategoriesAndValues = [
    {
        "category": "Category 1",
        "series_1": 57,
        "series_2": 124,
        ..... if 'series_3', 'series_4' etc. existed, it would be included in this as above
    },
    {
        "category": "Category 2",
        "series_1": 11,
        "series_2": 22,
        ..... if 'series_3', 'series_4' etc. existed, it would be included in this as above
    },
    {
        "category": "Category 3",
        "series_1": 120,
        "series_2": 127,
        ..... if 'series_3', 'series_4' etc. existed, it would be included in this as above
    }
]
arrays javascript json key-value
2021-11-24 02:19:06
6

최고의 응답

2

을 처리하는 여러 논리 속성을 할 수 있습니다 루프를 통해 각성 여부를 확인과 일치 정규식 series_\d+. 는 경우에 그것은,당신이 알고있는 그것은 당신이 필요로하는 특성이 증가하며,손잡이 그에 따라(속성이 존재 여부 확인 필요,지적했듯이 Jayce444).

다음과 같은 솔루션을 사용하는 Array.reduce. 에 흡진기 기능 여부를 확인 어큐뮬레이터 배열이 포함되는 항목과 같은 category 객실 하나로 현재를 통해 반복. 는 경우에 그것은,그것이 증가시키는 적절한 속성입니다. 그렇지 않으면,그것은 밀어 현재 항목을 어큐뮬레이터 배열입니다.

arrOne=[{series_1:25,category:"Category 1",series_2:50},{series_1:11,category:"Category 2",series_2:22},{series_1:32,category:"Category 1",series_2:74},{series_1:74,category:"Category 3",series_2:98},{series_1:46,category:"Category 3",series_2:29,series_3:50}];

const res = arrOne.reduce((a, b) => {
  let found = a.find(e => e.category == b.category)
  if (found) {
    Object.keys(b).forEach(e => {
      if (/series_\d+/g.test(e)) found[e] = found[e] ? found[e] + b[e] : b[e];
    })
  } else {
    a.push(b)
  }
  return a;
}, [])

console.log(res)

2021-11-24 02:38:52

이 방법을 나누기 때 모든 개체가 없는 동일한 시리즈는 키입니다. 예를 들면,추가 series_3: 5 를 처음 개체만,그것으로 끝나 series_3: NaN 에서 결과입니다.
Jayce444

지 않을 것이 새로운 시리즈 를 사용에 대한 동일한 범주에서 나중에 개? 그것은 또한 O(n^2) (I think)
Phil

@필 통지 주셔서 감사합니다. I've 업데이트 내 대답이다.
Spectric
1

이런 일할 수 있습니다.

arrOne = [ { "series_1": 25, "category": "Category 1", "series_2": 50 }, { "series_1": 11, "category": "Category 2", "series_2": 22 }, { "series_1": 32, "category": "Category 1", "series_2": 74 }, { "series_1": 74, "category": "Category 3", "series_2": 98 }, { "series_1": 46, "category": "Category 3", "series_2": 29 },];

const result = [];
arrOne.reduce((acc, {category, ...series}) => {
  if (acc.has(category)) {
    Object.entries(series).forEach(([key, value]) => {
      if (key.startsWith('series_')) {
        acc.get(category)[key] = (acc.get(category)[key] || 0) + value;
      }
    });
  } else {
    const item = {category, ...series};
    result.push(item);
    acc.set(category, item);
  }
  return acc;
}, new Map());

console.log(result);

2021-11-24 02:27:40

에 대한 확실하지 않는 감속기와 부작용(result 돌연변이)
Phil
0

지도를 만들 collate 시리즈 합니다.

그 배열을 만들에서는 지도 키로 category

const arr1 = [{"series_1":25,"category":"Category 1","series_2":50},{"series_1":11,"category":"Category 2","series_2":22},{"series_1":32,"category":"Category 1","series_2":74},{"series_1":74,"category":"Category 3","series_2":98},{"series_1":46,"category":"Category 3","series_2":29}]

const t1 = performance.now()

const cats = arr1.reduce((map, { category, ...series }) =>
  map.set(category, Object.entries(series)
    .reduce((s, [ key, count ]) => ({
      ...s,
      [ key ]: (s[key] ?? 0) + count
    }), map.get(category) ?? {})
  ), new Map())

const allCategoriesAndValues = Array.from(cats, ([ category, series ]) => ({
  category,
  ...series
}))

const t2 = performance.now()

console.info(allCategoriesAndValues)
console.log(`Took ${t2 - t1}ms`)
.as-console-wrapper { max-height: 100% !important; }

2021-11-24 02:32:20
0

내가 하는 이 방법...

const arrOne = 
  [ { series_1: 25, category: 'Category 1', series_2: 50 } 
  , { series_1: 11, category: 'Category 2', series_2: 22 } 
  , { series_1: 32, category: 'Category 1', series_2: 74 } 
  , { series_1: 74, category: 'Category 3', series_2: 98 } 
  , { series_1: 46, category: 'Category 3', series_2: 29 } 
  ] 

console.time('chrono')

const allCategoriesAndValues =
  Object.entries(
  arrOne.reduce((r,{ category, ...series })=>
    {
    let cat = r[category] = r[category] ?? {} 
    Object.entries(series).forEach(([sName,val]) => cat[sName] = (cat[sName] ?? 0) + val);
    return r
    },{})
  ).map(([category,series])=>({category,...series}))

console.timeEnd('chrono')

console.log( allCategoriesAndValues )
.as-console-wrapper {max-height: 100%!important;top:0 }

2021-11-24 02:47:52
0

할 수 있습니다 그냥 반복의 배열체를 다음의 열쇠는 각 개체,저장 버퍼로 개체입니다. 당신은 단지 하나의 존재에 대한 확인을 각 키에 추가 누락된 경우,또는 당신은 수 있습 coalesce falsey 키으로 기본값이처럼 했습니다. 를 제거 카테고리에서 키체를 받은 후에 그 가치,그래서 내가 없을 시도하면 그것을 건너는 동안 키가 반복이다.

const arrOne = [
  {"series_1": 25, "category": "Category 1", "series_2": 50},
  {"series_1": 11, "category": "Category 2", "series_2": 22},
  {"series_1": 32, "category": "Category 1", "series_2": 74},
  {"series_1": 74, "category": "Category 3", "series_2": 98},
  {"series_1": 46, "category": "Category 3", "series_2": 29},
];

let buffer = {};
arrOne.forEach(i=>{
  let c = i.category;
  buffer[c] = buffer[c] || {};
  delete i.category;
  Object.keys(i).forEach(k=>{
    buffer[c][k] = buffer[c][k] || 0;
    buffer[c][k] += i[k];
  });
});

console.log(buffer);

let final = Object.keys(buffer).map(k=>{return {[k]: buffer[k]}});
console.log(final);

하지 않는 경우는 이열에서 마지막 단계는 선택입니다. 그것만이 존재하는 변형체로 훌륭한 기능들을 가지고 있습니다.

2021-11-24 02:31:18
0

여기에는 방법이다 나는 그것을 할 것입

const res = arrOne.reduce((acc, { category, ...vals }) => {
    if (acc[category]) {
        Object.entries(vals).forEach(([ key, val ]) => acc[category][key] = acc[category][key] ? acc[category][key] + val : val);

    } else {
        acc[category] = vals;

    }

    return acc;
}, {});
2021-11-24 03:11:13

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................