davs0ft
davs0ft

Reputation: 43

Why is my mapping returning too many entries?

I need to map an array of dates. Each one of these dates belongs to a group of dates (format array).

So let's say: Format array is: let format = [3, 3, 1, 5, 4, 4, 3, 5, 13, 10, 3, 5, 5, 2, 2, 10];

That means the first three dates of the dates array are a group of dates, the next 3; the next one is a single date, the next 5... etc.

So my expecting output would be 16 items (same as format length). The output should be, for example: The first group of dates: Start: lowest date of that group End: highest date of that group

But my output is returning the same entries of date length.

let format = [3, 3, 1, 5, 4, 4, 3, 5, 13, 10, 3, 5, 5, 2, 2, 10];
let dates = [
  "2021-10-04T04:00:00.000Z",
  "2021-10-05T04:00:00.000Z",
  "2021-10-06T04:00:00.000Z",
  "2021-10-13T04:00:00.000Z",
  "2021-10-14T04:00:00.000Z",
  "2021-10-15T04:00:00.000Z",
  "2021-10-15T04:00:00.000Z",
  "2021-10-17T22:00:00.000Z",
  "2021-10-18T22:00:00.000Z",
  "2021-10-19T22:00:00.000Z",
  "2021-10-20T22:00:00.000Z",
  "2021-10-21T22:00:00.000Z",
  "2021-10-17T22:00:00.000Z",
  "2021-10-18T22:00:00.000Z",
  "2021-10-19T22:00:00.000Z",
  "2021-10-20T22:00:00.000Z",
  "2021-10-19T04:00:00.000Z",
  "2021-10-20T04:00:00.000Z",
  "2021-10-21T04:00:00.000Z",
  "2021-10-22T04:00:00.000Z",
  "2021-10-19T04:00:00.000Z",
  "2021-10-20T04:00:00.000Z",
  "2021-10-21T04:00:00.000Z",
  "2021-10-25T04:00:00.000Z",
  "2021-10-26T04:00:00.000Z",
  "2021-10-27T04:00:00.000Z",
  "2021-10-28T04:00:00.000Z",
  "2021-10-29T04:00:00.000Z",
  "2021-10-25T04:00:00.000Z",
  "2021-10-26T04:00:00.000Z",
  "2021-10-27T04:00:00.000Z",
  "2021-10-28T04:00:00.000Z",
  "2021-10-29T04:00:00.000Z",
  "2021-11-01T04:00:00.000Z",
  "2021-11-02T04:00:00.000Z",
  "2021-11-03T04:00:00.000Z",
  "2021-11-04T04:00:00.000Z",
  "2021-11-05T04:00:00.000Z",
  "2021-11-08T04:00:00.000Z",
  "2021-11-09T04:00:00.000Z",
  "2021-11-10T04:00:00.000Z",
  "2021-11-01T04:00:00.000Z",
  "2021-11-02T04:00:00.000Z",
  "2021-11-03T04:00:00.000Z",
  "2021-11-04T04:00:00.000Z",
  "2021-11-05T04:00:00.000Z",
  "2021-11-08T04:00:00.000Z",
  "2021-11-09T04:00:00.000Z",
  "2021-11-10T04:00:00.000Z",
  "2021-11-11T04:00:00.000Z",
  "2021-11-12T04:00:00.000Z",
  "2021-11-11T04:00:00.000Z",
  "2021-11-12T04:00:00.000Z",
  "2021-11-13T04:00:00.000Z",
  "2021-11-15T04:00:00.000Z",
  "2021-11-16T04:00:00.000Z",
  "2021-11-17T04:00:00.000Z",
  "2021-11-18T04:00:00.000Z",
  "2021-11-19T04:00:00.000Z",
  "2021-11-16T04:00:00.000Z",
  "2021-11-17T04:00:00.000Z",
  "2021-11-18T04:00:00.000Z",
  "2021-11-19T04:00:00.000Z",
  "2021-11-20T04:00:00.000Z",
  "2021-11-23T04:00:00.000Z",
  "2021-11-24T04:00:00.000Z",
  "2021-11-23T04:00:00.000Z",
  "2021-11-24T04:00:00.000Z",
  "2022-01-05T04:00:00.000Z",
  "2022-01-06T04:00:00.000Z",
  "2022-01-07T04:00:00.000Z",
  "2022-01-10T04:00:00.000Z",
  "2022-01-11T04:00:00.000Z",
  "2022-01-12T04:00:00.000Z",
  "2022-01-13T04:00:00.000Z",
  "2022-01-14T04:00:00.000Z",
  "2022-01-17T04:00:00.000Z",
  "2022-01-18T04:00:00.000Z"
];

var numTimesUsed = 0;
var nameIndex = 0;
let app_multiple = dates.map(function combineTitleData(dataItem, index) {
  if (format[nameIndex] == numTimesUsed) {
    nameIndex++;
    numTimesUsed = 0;
  }
  numTimesUsed++;
  let end = new Date(dates[nameIndex]);
  end.setDate(end.getDate() + parseInt(format[nameIndex]) - 1);
  return {
    start: dates[nameIndex],
    end: end
  };
});
//
console.log(app_multiple);

Thanks

Upvotes: 1

Views: 99

Answers (2)

mplungjan
mplungjan

Reputation: 177950

Splice will get the groups

const res = format.map(num => dates.splice(0,num))

let format = [3, 3, 1, 5, 4, 4, 3, 5, 13, 10, 3, 5, 5, 2, 2, 10];
let dates = [ "2021-10-04T04:00:00.000Z", "2021-10-05T04:00:00.000Z", "2021-10-06T04:00:00.000Z", "2021-10-13T04:00:00.000Z", "2021-10-14T04:00:00.000Z", "2021-10-15T04:00:00.000Z", "2021-10-15T04:00:00.000Z", "2021-10-17T22:00:00.000Z", "2021-10-18T22:00:00.000Z", "2021-10-19T22:00:00.000Z", "2021-10-20T22:00:00.000Z", "2021-10-21T22:00:00.000Z", "2021-10-17T22:00:00.000Z", "2021-10-18T22:00:00.000Z", "2021-10-19T22:00:00.000Z", "2021-10-20T22:00:00.000Z", "2021-10-19T04:00:00.000Z", "2021-10-20T04:00:00.000Z", "2021-10-21T04:00:00.000Z", "2021-10-22T04:00:00.000Z", "2021-10-19T04:00:00.000Z", "2021-10-20T04:00:00.000Z", "2021-10-21T04:00:00.000Z", "2021-10-25T04:00:00.000Z", "2021-10-26T04:00:00.000Z", "2021-10-27T04:00:00.000Z", "2021-10-28T04:00:00.000Z", "2021-10-29T04:00:00.000Z", "2021-10-25T04:00:00.000Z", "2021-10-26T04:00:00.000Z", "2021-10-27T04:00:00.000Z", "2021-10-28T04:00:00.000Z", "2021-10-29T04:00:00.000Z", "2021-11-01T04:00:00.000Z", "2021-11-02T04:00:00.000Z", "2021-11-03T04:00:00.000Z", "2021-11-04T04:00:00.000Z", "2021-11-05T04:00:00.000Z", "2021-11-08T04:00:00.000Z", "2021-11-09T04:00:00.000Z", "2021-11-10T04:00:00.000Z", "2021-11-01T04:00:00.000Z", "2021-11-02T04:00:00.000Z", "2021-11-03T04:00:00.000Z", "2021-11-04T04:00:00.000Z", "2021-11-05T04:00:00.000Z", "2021-11-08T04:00:00.000Z", "2021-11-09T04:00:00.000Z", "2021-11-10T04:00:00.000Z", "2021-11-11T04:00:00.000Z", "2021-11-12T04:00:00.000Z", "2021-11-11T04:00:00.000Z", "2021-11-12T04:00:00.000Z", "2021-11-13T04:00:00.000Z", "2021-11-15T04:00:00.000Z", "2021-11-16T04:00:00.000Z", "2021-11-17T04:00:00.000Z", "2021-11-18T04:00:00.000Z", "2021-11-19T04:00:00.000Z", "2021-11-16T04:00:00.000Z", "2021-11-17T04:00:00.000Z", "2021-11-18T04:00:00.000Z", "2021-11-19T04:00:00.000Z", "2021-11-20T04:00:00.000Z", "2021-11-23T04:00:00.000Z", "2021-11-24T04:00:00.000Z", "2021-11-23T04:00:00.000Z", "2021-11-24T04:00:00.000Z", "2022-01-05T04:00:00.000Z", "2022-01-06T04:00:00.000Z", "2022-01-07T04:00:00.000Z", "2022-01-10T04:00:00.000Z", "2022-01-11T04:00:00.000Z", "2022-01-12T04:00:00.000Z", "2022-01-13T04:00:00.000Z", "2022-01-14T04:00:00.000Z", "2022-01-17T04:00:00.000Z", "2022-01-18T04:00:00.000Z" ];

const res = format.map(num => {
  const arr = dates.splice(0,num)
  const start = arr.shift(); // take  the first
  const end = arr.length === 0 ? start : arr.pop(); // take the last if there
  return { start, end }
})
console.log(res)

To get an array of objects of start and end (you asked for only start if no end) you can do this - I am assuming the date strings are sorted. If not, you can easily sort the strings with dates.sort()

const res = format.map(num => {
  const arr = dates.splice(0, num)
  const start = arr.shift();
  const end = arr.length === 0 ? "" : arr.pop(); 
  return end ? { start, end } : { start }
})
console.log(res)

let format = [3, 3, 1, 5, 4, 4, 3, 5, 13, 10, 3, 5, 5, 2, 2, 10];
let dates = [ "2021-10-04T04:00:00.000Z", "2021-10-05T04:00:00.000Z", "2021-10-06T04:00:00.000Z", "2021-10-13T04:00:00.000Z", "2021-10-14T04:00:00.000Z", "2021-10-15T04:00:00.000Z", "2021-10-15T04:00:00.000Z", "2021-10-17T22:00:00.000Z", "2021-10-18T22:00:00.000Z", "2021-10-19T22:00:00.000Z", "2021-10-20T22:00:00.000Z", "2021-10-21T22:00:00.000Z", "2021-10-17T22:00:00.000Z", "2021-10-18T22:00:00.000Z", "2021-10-19T22:00:00.000Z", "2021-10-20T22:00:00.000Z", "2021-10-19T04:00:00.000Z", "2021-10-20T04:00:00.000Z", "2021-10-21T04:00:00.000Z", "2021-10-22T04:00:00.000Z", "2021-10-19T04:00:00.000Z", "2021-10-20T04:00:00.000Z", "2021-10-21T04:00:00.000Z", "2021-10-25T04:00:00.000Z", "2021-10-26T04:00:00.000Z", "2021-10-27T04:00:00.000Z", "2021-10-28T04:00:00.000Z", "2021-10-29T04:00:00.000Z", "2021-10-25T04:00:00.000Z", "2021-10-26T04:00:00.000Z", "2021-10-27T04:00:00.000Z", "2021-10-28T04:00:00.000Z", "2021-10-29T04:00:00.000Z", "2021-11-01T04:00:00.000Z", "2021-11-02T04:00:00.000Z", "2021-11-03T04:00:00.000Z", "2021-11-04T04:00:00.000Z", "2021-11-05T04:00:00.000Z", "2021-11-08T04:00:00.000Z", "2021-11-09T04:00:00.000Z", "2021-11-10T04:00:00.000Z", "2021-11-01T04:00:00.000Z", "2021-11-02T04:00:00.000Z", "2021-11-03T04:00:00.000Z", "2021-11-04T04:00:00.000Z", "2021-11-05T04:00:00.000Z", "2021-11-08T04:00:00.000Z", "2021-11-09T04:00:00.000Z", "2021-11-10T04:00:00.000Z", "2021-11-11T04:00:00.000Z", "2021-11-12T04:00:00.000Z", "2021-11-11T04:00:00.000Z", "2021-11-12T04:00:00.000Z", "2021-11-13T04:00:00.000Z", "2021-11-15T04:00:00.000Z", "2021-11-16T04:00:00.000Z", "2021-11-17T04:00:00.000Z", "2021-11-18T04:00:00.000Z", "2021-11-19T04:00:00.000Z", "2021-11-16T04:00:00.000Z", "2021-11-17T04:00:00.000Z", "2021-11-18T04:00:00.000Z", "2021-11-19T04:00:00.000Z", "2021-11-20T04:00:00.000Z", "2021-11-23T04:00:00.000Z", "2021-11-24T04:00:00.000Z", "2021-11-23T04:00:00.000Z", "2021-11-24T04:00:00.000Z", "2022-01-05T04:00:00.000Z", "2022-01-06T04:00:00.000Z", "2022-01-07T04:00:00.000Z", "2022-01-10T04:00:00.000Z", "2022-01-11T04:00:00.000Z", "2022-01-12T04:00:00.000Z", "2022-01-13T04:00:00.000Z", "2022-01-14T04:00:00.000Z", "2022-01-17T04:00:00.000Z", "2022-01-18T04:00:00.000Z" ];

const res = format.map(num => {
  const arr = dates.splice(0, num)
  const start = arr.shift();
  const end = arr.length === 0 ? "" : arr.pop()
  return end ? { start, end } : { start }
})
console.log(res)

Or same start and end if only one date:

const res = format.map(num => {
  const arr = dates.splice(0, num)
  const start = arr.shift();
  const end = arr.length === 0 ? start : arr.pop(); 
  return { start, end }
})
console.log(res)

Upvotes: 4

vaira
vaira

Reputation: 2270

Map always return the same number of input as the output, so if you use dates you cant expect to get format array length output. So we use the format as in input of the map to get array collection.

let format = [3, 3, 1, 5, 4, 4, 3, 5, 13, 10, 3, 5, 5, 2, 2, 10];
let dates = [
  "2021-10-04T04:00:00.000Z",
  "2021-10-05T04:00:00.000Z",
  "2021-10-06T04:00:00.000Z",
  "2021-10-13T04:00:00.000Z",
  "2021-10-14T04:00:00.000Z",
  "2021-10-15T04:00:00.000Z",
  "2021-10-15T04:00:00.000Z",
  "2021-10-17T22:00:00.000Z",
  "2021-10-18T22:00:00.000Z",
  "2021-10-19T22:00:00.000Z",
  "2021-10-20T22:00:00.000Z",
  "2021-10-21T22:00:00.000Z",
  "2021-10-17T22:00:00.000Z",
  "2021-10-18T22:00:00.000Z",
  "2021-10-19T22:00:00.000Z",
  "2021-10-20T22:00:00.000Z",
  "2021-10-19T04:00:00.000Z",
  "2021-10-20T04:00:00.000Z",
  "2021-10-21T04:00:00.000Z",
  "2021-10-22T04:00:00.000Z",
  "2021-10-19T04:00:00.000Z",
  "2021-10-20T04:00:00.000Z",
  "2021-10-21T04:00:00.000Z",
  "2021-10-25T04:00:00.000Z",
  "2021-10-26T04:00:00.000Z",
  "2021-10-27T04:00:00.000Z",
  "2021-10-28T04:00:00.000Z",
  "2021-10-29T04:00:00.000Z",
  "2021-10-25T04:00:00.000Z",
  "2021-10-26T04:00:00.000Z",
  "2021-10-27T04:00:00.000Z",
  "2021-10-28T04:00:00.000Z",
  "2021-10-29T04:00:00.000Z",
  "2021-11-01T04:00:00.000Z",
  "2021-11-02T04:00:00.000Z",
  "2021-11-03T04:00:00.000Z",
  "2021-11-04T04:00:00.000Z",
  "2021-11-05T04:00:00.000Z",
  "2021-11-08T04:00:00.000Z",
  "2021-11-09T04:00:00.000Z",
  "2021-11-10T04:00:00.000Z",
  "2021-11-01T04:00:00.000Z",
  "2021-11-02T04:00:00.000Z",
  "2021-11-03T04:00:00.000Z",
  "2021-11-04T04:00:00.000Z",
  "2021-11-05T04:00:00.000Z",
  "2021-11-08T04:00:00.000Z",
  "2021-11-09T04:00:00.000Z",
  "2021-11-10T04:00:00.000Z",
  "2021-11-11T04:00:00.000Z",
  "2021-11-12T04:00:00.000Z",
  "2021-11-11T04:00:00.000Z",
  "2021-11-12T04:00:00.000Z",
  "2021-11-13T04:00:00.000Z",
  "2021-11-15T04:00:00.000Z",
  "2021-11-16T04:00:00.000Z",
  "2021-11-17T04:00:00.000Z",
  "2021-11-18T04:00:00.000Z",
  "2021-11-19T04:00:00.000Z",
  "2021-11-16T04:00:00.000Z",
  "2021-11-17T04:00:00.000Z",
  "2021-11-18T04:00:00.000Z",
  "2021-11-19T04:00:00.000Z",
  "2021-11-20T04:00:00.000Z",
  "2021-11-23T04:00:00.000Z",
  "2021-11-24T04:00:00.000Z",
  "2021-11-23T04:00:00.000Z",
  "2021-11-24T04:00:00.000Z",
  "2022-01-05T04:00:00.000Z",
  "2022-01-06T04:00:00.000Z",
  "2022-01-07T04:00:00.000Z",
  "2022-01-10T04:00:00.000Z",
  "2022-01-11T04:00:00.000Z",
  "2022-01-12T04:00:00.000Z",
  "2022-01-13T04:00:00.000Z",
  "2022-01-14T04:00:00.000Z",
  "2022-01-17T04:00:00.000Z",
  "2022-01-18T04:00:00.000Z"
];


// convert string into dates for comparison
const realDates = dates.map(d => new Date(d));

// use map on format since, map always return the same number of input array length, so that was ur clue to use format instead of dates 
const dateGroup = format.map(num => realDates.slice(0,num));

// now you only need to iterate over the array to return the new form
let app_multiple = dateGroup.map(function createNewObject(singleDateCollection, index) {

  return {
    start: new Date(Math.min.apply(null,singleDateCollection)),
    end: new Date(Math.max.apply(null,singleDateCollection))
  };
});
//
console.log(app_multiple);

Upvotes: 0

Related Questions