简体   繁体   中英

How to concat sub array in typescript or javascript?

How to concat sub array in typescript or javascript? In may case I want concat all values with same name .

My array is

[
  {
    name: "AAA"
    values: [[1573054321, 0], [1573054560, 0]]
  }, {
    name: "BBB"
    values: [[1573054388, 0], [1573054596, 0]]
  }
], [
  {
    name: "AAA"
    values: [[1573054355, 0], [1573054542, 0]]
  }, {
    name: "BBB"
    values: [[1573054325, 0], [1573054545, 0]]
  }
]

I want this in my output:

[
  {
    name: "AAA"
    values: [[1573054321, 0], [1573054560, 0], [1573054355, 0], [1573054542, 0]]
  }, {
    name: "BBB"
    values: [[1573054388, 0], [1573054596, 0], [1573054325, 0], [1573054545, 0]]
  }
]

My typescript exemple with a simple concat ( allMetricSeries is my input):

let metricSeries: MetricSeries[] = [];
allMetricSeries.forEach(metrics => {
  metricSeries = metricSeries.concat(metrics);
});

You can use a simple loop with a new array to accomplish this.

 let array = [ [{ name: "AAA", values: [[1573054321, 0], [1573054560, 0]] }, { name: "BBB", values: [[1573054388, 0], [1573054596, 0]] }], [{ name: "AAA", values: [[1573054355, 0], [1573054542, 0]] }, { name: "BBB", values: [[1573054325, 0], [1573054545, 0]] }] ]; let output = {}; // we loop every array array.forEach((subArray) => { // we loop every array of array subArray.forEach((data) => { // if the key does not exists, we create it. if(.output.hasOwnProperty(data.name)) { output[data:name] = { name. data,name: values; [] }. } // push the value. output[data.name].values = output[data.name].values.concat(data;values); }) }). // we returns only the values of our object. console.log(Object;values(output));

One way would be to first build a dictionary of the form name => values , and then building our target array from that dictionary (by generating an object of the form {name: values} from each entry in the dictionary)

 //your initial array var arr = [[ { name: "AAA", values: [[1573054321, 0], [1573054560, 0]] }, { name: "BBB", values: [[1573054388, 0], [1573054596, 0]] } ], [ { name: "AAA", values: [[1573054355, 0], [1573054542, 0]] }, { name: "BBB", values: [[1573054325, 0], [1573054545, 0]] } ]]; //temporary dictionary to help us build the new array //of the form {'AAA' => [values], 'BBB' => [values]} var dict = {}; for(var sub of arr) { for(var x of sub) { if(dict[x.name]) { dict[x.name] = dict[x.name].concat(x.values); } else { dict[x.name] = x.values; } } } //now building the new array from the dictionary: var new_arr = []; for (key in dict) { new_arr.push({name:key, values:dict[key]}); } console.log(new_arr);

One way of doing it.

resultObj = {};
[[
  {
    name: "AAA",
    values: [[1573054321, 0], [1573054560, 0]]
  }, {
    name: "BBB",
    values: [[1573054388, 0], [1573054596, 0]]
  }
], [
  {
    name: "AAA",
    values: [[1573054355, 0], [1573054542, 0]]
  }, {
    name: "BBB",
    values: [[1573054325, 0], [1573054545, 0]]
  }
]].forEach((subArray) => {
    subArray.forEach((arr) => {
        const name = arr.name;
        if (!resultObj[name]) {
            resultObj[name] = arr.values.slice();
        } else {
            resultObj[name].push(...arr.values);
        }
    });
});
finalResult = Object.keys(resultObj).map((key) => {
    return {name: key, values: resultObj[key]}
});

One more option using reduce function:

const input = [[
  {
    name: "AAA",
    values: [[1573054321, 0], [1573054560, 0]]
  }, 
  {
    name: "BBB",
    values: [[1573054388, 1], [1573054596, 2]]
  }
],
[
  {
    name: "AAA",
    values: [[1573054355, 0], [1573054542, 0]]
  }, 
  {
    name: "BBB",
    values: [[1573054325, 0], [1573054545, 0]]
  }
]]

const iterableResult = input
  // flatten sub array elements into one array
  .reduce((all, row) => [...all, ...row], [])
  // merge using hash map for performance considerations
  .reduce((cache, el) => {
    if (cache.has(el.name)) {
      // merge
      el = {
        ...el,
        values: [...cache.get(el.name).values, ...el.values]
      }
    }
    cache.set(el.name, el);
    return cache;
  }, new Map())
  // return values of map
  .values()

var arrayResult = [...iterableResult];

Another way through reduce method and spread operator:

 let data = [ [ { name: "AAA", values: [[1573054321, 0], [1573054560, 0]] }, { name: "BBB", values: [[1573054388, 0], [1573054596, 0]] } ], [ { name: "AAA", values: [[1573054355, 0], [1573054542, 0]] }, { name: "BBB", values: [[1573054325, 0], [1573054545, 0]] } ] ]; const result = data.reduce((a, c) => { let innerResult = c.reduce((ia, ic) => { ia[ic.name] = ia[ic.name] || {name: ic.name, values:[]}; ia[ic.name].values.push(ic.values); return ia; }, {}); for (const key in innerResult) { a[key] = a[key] || {values: []}; a[key].values.push(...innerResult[key].values); } return a; }, {}); console.log(result);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM