What is the best way to retrieve the last 3 elements that have a specific name value using JMESPATH and JavaScript?

Below is a JSON data array that I have:

[{"name":"Button1","date":"1596959802144"},{"name":"Button2","date":"1596959804238"},{"name":"Button3","date":"1596959809334"},{"name":"Button1","date":"1597000878135"},{"name":"Button2","date":"1597000896335"},{"name":"Button3","date":"1597000901536"},{"name":"Button2","date":"1597000904437"},{"name":"Button3","date":"1597000909535"},{"name":"Button1","date":"1597000912250"},{"name":"Button2","date":"1597000939937"},{"name":"Button3","date":"1597000957940"},{"name":"Button2","date":"1597000964640"},{"name":"Button1","date":"1597001005141"},{"name":"Button2","date":"1597001010240"},{"name":"Button3","date":"1597001014845"},{"name":"Button2","date":"1597001021644"},{"name":"Button1","date":"1597001025738"},{"name":"Button2","date":"1597001049030"},{"name":"Button3","date":"1597001054139"},{"name":"Button1","date":"1597001057741"},{"name":"Button2","date":"1597001060340"},{"name":"Button3","date":"1597001062445"},{"name":"Button1","date":"1597002599045"},{...}

I am looking to use the JMESPath JavaScript library to retrieve only the last 3 entries for each distinct name value. For example:

[{"name":"Button3","date":"1597001014845"},{"name":"Button2","date":"1597001021644"},{"name":"Button2","date":"1597001049030"},{"name":"Button3","date":"1597001054139"},{"name":"Button2","date":"1597001060340"},{"name":"Button3","date":"1597001062445"},{"name":"Button1","date":"1597002694136"},{"name":"Button1","date":"1597002696349"},{"name":"Button1","date":"1597002699243"}]

This retrieves the last 3 occurrences per distinct button name.

I came across a solution on Stack Overflow using JQ:

map_values(delpaths(keys_unsorted[:-2] | map([.]))

Get last N elements for each item of a JSON object

Is there another way to achieve this or using a different JavaScript module?

Answer №1

If maintaining the order of elements in your final array is not a concern, you can achieve this using a pure JavaScript approach:

const getLastNForEveryName = (arr, n) => {
  const lastNOfEach = arr.reduce((acc, curr) => {
    if(acc[curr.name] == null) { // Create a new key with current item if it doesn't exist
      acc[curr.name] = [curr]; 
    } else {
      if(acc[curr.name].length >= n) // Remove the first element if the array size reaches limit
        acc[curr.name].shift();

      acc[curr.name].push(curr); // Add current item to the array
    }
    return acc;
  }, {})
  
  return Object.values(lastNOfEach).flatMap(l => l); // Get values and flatten to avoid nested arrays
}

// Testing
const values = [{"name":"Button1","date":"1596959802144"},{"name":"Button2","date":"1596959804238"},{"name":"Button3","date":"1596959809334"},{"name":"Button1","date":"1597000878135"},{"name":"Button2","date":"1597000896335"},{"name":"Button3","date":"1597000901536"},{"name":"Button2","date":"1597000904437"},{"name":"Button3","date":"1597000909535"},{"name":"Button1","date":"1597000912250"},{"name":"Button2","date":"1597000939937"},{"name":"Button3","date":"1597000957940"},{"name":"Button2","date":"1597000964640"},{"name":"Button1","date":"1597001005141"},{"name":"Button2","date":"1597001010240"},{"name":"Button3","date":"1597001014845"},{"name":"Button2","date":"1597001021644"},{"name":"Button1","date":"1597001025738"},{"name":"Button2","date":"1597001049030"},{"name":"Button3","date":"1597001054139...

console.log(getLastNForEveryName(values, 3));

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

The component is no longer able to locate the imported element when it is being shared

Recently, I imported a component into the shared module in order to use it across 2 different modules. However, upon recompiling the app, an error message appeared stating that the jodit-editor, which is utilized by the shared component, is not recognized ...

AngularJS does not hide the Onsen UI modal

I am new to working with angularjs and onsen ui. I have implemented a modal in an ajax request, which is supposed to hide upon successful response. Everything seems to be working fine, except for the fact that when I navigate back to the page, the modal re ...

Tips for incorporating a variable into a JSON object value when dynamically constructing an object

Is there a way to dynamically create an array of objects using a for loop? I have different arrays with values for the key value pairs of these objects. The code snippet I tried is not producing the expected result. var characters = ['Iron Man', ...

Is there a way to extract the value of a child object from an object within the MUI Datagrid

Using the following method: useEffect(() => { PetService.getAll("/pets") .then(response => { setData(response.content); }) }, [setData]); The response obtained is as follows: { "timestamp": 167818109 ...

Utilizing Javascript or jQuery to showcase Facebook Events directly on a website

I have been working with the facebook SDK for javascript and successfully retrieved data in the browser console using sample code. index.html:377 API response Object {data: Array[7], paging: Object} data: Array[7] 0: Object description: "This is just an ...

using a variable object to load, access data, and handle errors through mutations

element, I have incorporated two distinct mutations in a single react component: const [get_items, { error, loading, data }] = useMutation(GET_ITEMS); const [add_to_cart] = useMutation(ADD_TO_CART); To streamline and access both components' error, ...

Encountering issues with Jquery while retrieving data from a .json URL

While attempting to retrieve data using a small script that usually works with URLs producing JSON data, I encountered a syntax error when trying it with a URL ending in .json. //error Uncaught SyntaxError: Unexpected token : http://frontier.ffxiv.com/wo ...

Having trouble sending an HTTPS request in NodeJS only to receive an HTTP response instead

As I develop my website using NodeJS and deploy it on Heroku, I encountered an issue upon opening the website. Here is the problem at hand: When looking at the main source file of my web application: app.get('/', (req, res) => { var data ...

Enter the Angular Date Picker on Safari

While working with Angular and ngx-bootstrap, I encountered an issue where the input type=date does not function properly on Safari Browser. Can anyone suggest a solution to fix this problem? ...

Ensure that the letters of the Alphabet are capitalized when there is a space before them while typing in the text box

Is there a way to automatically capitalize the letter that comes after a space in a user's input in a textbox? For example, if a user types "test new," could we make it so that the "n" is automatically capitalized as if the shift key had been pressed ...

Exploring the possibilities of utilizing a Kendo grid within an ASP.NET Web API

I am currently using the open source edition of Kendo Web with the Kendo UI Web on ASP.NET MVC 4. My Kendo grid contains the following JavaScript code: <script> $(document).ready(function () { $("#grid").kendoGrid({ dataSource: ...

Navigating a Facebook page login can have its challenges. Let's uncover the

Facebook now allows pages to be created without any associated Facebook users. These unowned pages are also able to sign into applications. How can an application identify and manage this scenario? Logout of Facebook Create a new Facebook page You have s ...

Combine multiple arrays of JSON objects into a single array in PHP

I have organized a json array of results in php and here is the output: [{ "05-10-2018": "Seeing dads differently" }, { "05-10-2018": "Extraordinary ordinary Britain" }, { "05-10-2018": " Roll up for the Social Science Market!" }, { "05-10 ...

List of dropdown options retrieved from SQLite database

I am attempting to retrieve data from an SQLite database table in order to populate a dropdown menu list. My thought process is outlined below. The main issue I am facing is how to integrate the JS function with the HTML section. HTML.html <label ...

Is it possible to utilize a single command in Discord.js to send multiple embeds?

Is there a way to create a unique bot in Node.js (using Discord.js) by utilizing Visual Studio Code? This exceptional bot should be capable of responding with various embed messages when given one specific command. I attempted using command handler, but u ...

ERROR: JSON parsing failed due to an unexpected token "<", indicating an issue with the syntax and structure of the input data

Currently, I am following a tutorial on Scrimba to learn about React and React Router 6. Unfortunately, I have encountered an error with the data provided in the tutorial. The error message reads as follows: 67:1 Uncaught (in promise) SyntaxError: Unexpect ...

Unlock hidden content with a single click using jQuery's click event

I have a question that seems simple, but I can't quite get the syntax right. My issue is with a group of stacked images. When I click on an image, I want it to move to the front and display the correct description above it. Currently, clicking on the ...

Issues with JQuery list selectors

Many individuals have raised concerns about selectors in the past, but no matter what I try, my code seems right yet it doesn't work as intended. My situation involves a list of actions that are displayed or hidden when their corresponding "folder" is ...

What is the best way to add a color swatch image using Javascript?

I'm facing a challenge in Shopify where I need to assign corresponding background images to color swatches. Currently, my icons are set up with the correct links for each color, but they are missing their respective images, similar to this example. I ...

Can AngularJS Filters be used to convert a number into a string, but not the other way around?

After researching Angular JS filters, I discovered that the number filter is used to format a number as a string. However, there doesn't seem to be a built-in filter for converting a string to a number. In an attempt to solve this issue, here is so ...