Home > Mobile >  How can I make a new array from a event emitter ( gives bytes array), where new arrays first element
How can I make a new array from a event emitter ( gives bytes array), where new arrays first element

Time:02-08

I have incoming bytes of arrays once a time. It kind of looks like this

[10,12,34,58,62]

[83,33,23,44,13]

[10,12,34,58,62]

[34, 77,54,23,87]

[83,33,23,44,13]

[10,12,34,58,62]

[83,33,23,44,66]

[13] …continues.

So, it renders each array every time. I needed them to be rendered like

[10,12,34,58,62,83,33,23,44,13]

[10,12,34,58,62,34,77,54,23,87,83,33,23,44,13]

[10,12,34,58,62,83,33,23,44,66,13].

The first element will be 10 and the last 13. Can anyone help me with the code? Thanks in advance.

CodePudding user response:

// @param {accumulator} is array of array of numbers
// @param {chunk} is the array of numbers
// @return {accumulator} 
const process_bytes = (accumulator, chunk) => {
    if (accumulator && accumulator.length) {
        if (chunk && chunk.length) {
            if (chunk[0] === 10) {
                return [...accumulator, chunk];
            } else {
                return [...accumulator.slice(0, accumulator.length - 1), [...accumulator[accumulator.length - 1], ...chunk]];
            }
        }
    }
    return chunk && chunk.length && [chunk] || [];
};

Assumption

The following code follows the provided input data and the expected output in the OP


RUN THE CODE

const process_bytes = (accumulator, chunk) => {
  if (accumulator && accumulator.length) {
    if (chunk && chunk.length) {
      if (chunk[0] === 10) {
        return [...accumulator, chunk];
      } else {
        return [...accumulator.slice(0, accumulator.length - 1), [...accumulator[accumulator.length - 1], ...chunk]];
      }
    }
  }
  return chunk && chunk.length && [chunk] || [];
};

const testData = [
  [10, 12, 34, 58, 62],
  [83, 33, 23, 44, 13],
  [10, 12, 34, 58, 62],
  [34, 77, 54, 23, 87],
  [83, 33, 23, 44, 13],
  [10, 12, 34, 58, 62],
  [83, 33, 23, 44, 66]
];

let processed_bytes = [];

testData.forEach(x => {
  processed_bytes = process_bytes(processed_bytes, x);
});
console.log(processed_bytes);



WYSIWYG => WHAT YOU SHOW IS WHAT YOU GET

CodePudding user response:

If your incoming bytes is 2d array then try this.

let arr = [
  [10, 12, 34, 58, 62],
  [83, 33, 23, 44, 13],
  [10, 12, 34, 58, 62],
  [34, 77, 54, 23, 87],
  [83, 33, 23, 44, 13],
  [10, 12, 34, 58, 62],
  [83, 33, 23, 44, 66],
  [13]
]
let openedArr = []
for (let value of arr) {
  openedArr = [...openedArr, ...value]
}

let resultArr = []
let child = []

for (let value of openedArr) {
  child.push(value)
  if (value == 13) {
    resultArr.push(child)
    child = []
  }
}
console.log(resultArr)

Explaination

  1. Make an new array by spreading all incoming array.
  2. Create two arrays resultArr and Child Array
  3. Push every array elements to Child array
  4. If there is 13, then push child array to resultArr, and empty child array.

CodePudding user response:

You can simply use a new array and use it for your calculations:

const newArray = [10, ...binaryArray, 13]
  •  Tags:  
  • Related