Home > front end >  Finding like values and appending items to array (javascript)
Finding like values and appending items to array (javascript)

Time:08-19

I have two arrays I'm trying to combine in a very specific way and I need a little guidance. Array1 is an array of dates 30-40 items, Array 2 is a list of objects with a date inside one of the attributes. I'm trying to append the object in array 2 to the index of array1 when the dates match.

I want to put arr2 in the same index as arr1 if the dates match.

const arr = [
    "2022-06-26T07:00:00.000Z",
    "2022-06-27T07:00:00.000Z",
    "2022-06-28T07:00:00.000Z",
    "2022-06-29T07:00:00.000Z",
    "2022-06-30T07:00:00.000Z",
    "2022-07-01T07:00:00.000Z",
    "2022-07-02T07:00:00.000Z",
    "2022-07-03T07:00:00.000Z",
    "2022-07-04T07:00:00.000Z",
    "2022-07-05T07:00:00.000Z",
    "2022-07-06T07:00:00.000Z",
    "2022-07-07T07:00:00.000Z",
    "2022-07-08T07:00:00.000Z",
    "2022-07-09T07:00:00.000Z",
    "2022-07-10T07:00:00.000Z",
    "2022-07-11T07:00:00.000Z",
    "2022-07-12T07:00:00.000Z",
    "2022-07-13T07:00:00.000Z",
    "2022-07-14T07:00:00.000Z",
    "2022-07-15T07:00:00.000Z",
    "2022-07-16T07:00:00.000Z",
    "2022-07-17T07:00:00.000Z",
    "2022-07-18T07:00:00.000Z",
    "2022-07-19T07:00:00.000Z",
    "2022-07-20T07:00:00.000Z",
    "2022-07-21T07:00:00.000Z",
    "2022-07-22T07:00:00.000Z",
    "2022-07-23T07:00:00.000Z",
    "2022-07-24T07:00:00.000Z",
    "2022-07-25T07:00:00.000Z",
    "2022-07-26T07:00:00.000Z",
    "2022-07-27T07:00:00.000Z",
    "2022-07-28T07:00:00.000Z",
    "2022-07-29T07:00:00.000Z",
    "2022-07-30T07:00:00.000Z",
    "2022-07-31T07:00:00.000Z",
    "2022-08-01T07:00:00.000Z",
    "2022-08-02T07:00:00.000Z",
    "2022-08-03T07:00:00.000Z",
    "2022-08-04T07:00:00.000Z",
    "2022-08-05T07:00:00.000Z",
    "2022-08-06T07:00:00.000Z"
]

const arr2 = [
    {
        "gsi1SK": "name ",
        "searchPK": "thing",
        "SK": "uuid",
        "Desc": "place #1205",
        "PK": "thing uuid",
        "searchSK": "7/1/2022",
        "gsi1PK": "thing",
        "Complete": false,
        "Users": [
            "person1",
            "person2"
        ]
    },
    {
        "gsi1SK": "name",
        "searchPK": "thing",
        "SK": "uuid",
        "Desc": "place#124124",
        "PK": "thing uuid",
        "searchSK": "7/4/2022",
        "gsi1PK": "thing",
        "Complete": false,
        "Users": [
            "person2",
            "person45"
        ]
    }
]





console.log([arr, arr2]); 

CodePudding user response:

You seem to have a handle on the date conversion part. Here I've defined two short sample arrays to represent arr2 and newArr. Then, a map function to create the output.

const arr2 = [
{
  "OTHER_FIELDS": "TOP SECRET",
  "searchSK":"7/4/2022"
},
{
  "OTHER_FIELDS": "TOP SECRET",
  "searchSK":"7/9/2022"
}
];

const newArr = [
  [
    "7/2/2022"
  ],
  [
    "7/3/2022"
  ],
  [
    "7/4/2022"
  ],
  [
    "7/5/2022"
  ],
  [
    "7/6/2022"
  ],
  [
    "7/7/2022"
  ],
  [
    "7/8/2022"
  ],
  [
    "7/9/2022"
  ],
  [
    "7/10/2022"
  ]
];

// for each subarray in newArr, return an array containing the existing element plus any elements from arr2 found by the filter function
const output = newArr.map(el => [...el, ...arr2.filter(a2 => a2.searchSK === el[0])]);

console.log(output);

CodePudding user response:

Plan

You've got two obvious options:

  • A. Look at each of the objects, finding a home for each one in turn
  • B. Look at each of the dates, collecting all the objects that belong to it

Which method makes more sense for you will depend on other factors you haven't covered in your post. I think the main question is: is it guaranteed that the date list will contain a proper home for every object? If no, then do you want to drop the objects without proper homes, or do you want to create a proper home for the objects

Performance can also matter, but really only if you expect either list to be very long or if you need to run this process multiple times (such as in a React component in the browser).

Implement

Loop through the list you chose. For each item, scan the other list for the relevant item(s): its home or its children. Take the appropriate action for those items depending on which plan you chose.

Another consideration is: don't mutate your arguments. That means you probably need to create copies of the two input arrays before you do the work. If the arrays contain objects rather than scalars, you can't just do array.slice() to create a copy.

  • For an array of POJOs, you can convert the source to a string and then back again to create a clone.
  • The array of dates will need special handling, because JSON.parse will not revive dates.

Mutating arguments is generally a bad practice, at least in the functional paradigm that underlies many popular front-end frameworks today. Plus, if you create your own copies of the input data, you can gain efficiency by moving items from the source arrays to the output array, which means that subsequent iterations won't have to re-examine items that have already been processed.

  • Related