• 0

Transmit an array of strings in a POST operation using Jquery/AJAX


Question

Hello! I would like to submit an array of strings from a web form to my web service and need a little bit of hand holding. My web service I've written seems fine with having an array of strings as input but I'm not exactly sure how to encode this in javascript from my html form elements before I ship the data to my web service to be processed. The array of strings will be pretty small (on the order of 20x3 strings).

I suspect that there is a clever way to do this by coding the form correctly and just running a jquery .serialize() operation on the form and submitting it.

My first thought was to define a number of textbox inputs and give them incremental ID#'s such as "array0_0", "array0_1", "array0_2", "array1_0", "array1_1", "array_1_2", "array_2_1" etc.

Then as a first step before submitting the post, collect all the values in the textboxs and compile an array using 2 nested for loops. Something like that would probably work, but I was wondering if there was some magic that I could do in my form so that jquery recognizes an array of strings in my form so that the .serialize() function just does its magic.

Thanks!

-Shad

21 answers to this question

Recommended Posts

  • 0

Maybe use JSON to convert it back and forth as needed? That's how we do search suggestions on our website. A service serializes JSON, the ajax (jquery, really) javascript picks it up and parses it and displays the results.

  • 0

To be more specific... we have a series of services on one server... including a search service. When you type in a search box a javascript function sends off queries to the server (the web app action written to deal with this) which then queries the service. The service hands back the JSON response, all the action does is reads it as an input buffer and println's it out to the client. Once the javascript gets the response back it parses it and displays the result.

UI (javascript) --> Action (java) --> SERVICE (java) --> Action (java) --> UI (javascript)

  • 0


var arrayToStore = new Array();
var $strings = $('form input');
$strings.each(function(){
arrayToStore.push(this.val());
})
[/CODE]

Also, if you want to store them with a specific key, give them all a data-something attribute rather than abusing the ID property.

  • 0


var arrayToStore = new Array();
var $strings = $('form input');
$strings.each(function(){
arrayToStore.push(this.val());
})
[/CODE]

Also, if you want to store them with a specific key, give them all a data-something attribute rather than abusing the ID property.

I thought that it was only considered "abuse" if you don't use unique IDs.

Your solution is a good start but I need to make a 2d string array in the end so I'll need to tweak it.

  • 0

I have some ideas to play around with. Haha, its funny how much time is spent just communicating between applications and services. This particular application started as a standalone windows program, but my boss wants tighter control so now I'm extending it with a web front end. I think I've spent more time trying to figure out jquery and javascript than I did with the whole write up of my application. I guess whatever you are use to is easy, its when you are up against a learning curve that makes things hard.

Still, I'm amazed at how powerful this jquery and AJAX stuff is and how far the tools have come in the past 10 years. When I was doing full time web development I did everything in server side PHP scripting with auxiliary basic javascript stuff. Using AJAX has the huge advantage of not having to redraw the whole page for every little thing. Now it seems like it is better to offload as much work on the client side as you can and just write auxiliary server side scripting.

  • 0

I thought that it was only considered "abuse" if you don't use unique IDs.

Your solution is a good start but I need to make a 2d string array in the end so I'll need to tweak it.

It's not abuse, per se, but if you can use the data- attribute, it makes much more sense to use it in a case like this. If you gave them all some data-location1 and data-location2 attribute (or however named), as you iterate through with each you can grab those attributes using .attr(), and then store the final string in your 2d array.

  • 0

It's not abuse, per se, but if you can use the data- attribute, it makes much more sense to use it in a case like this. If you gave them all some data-location1 and data-location2 attribute (or however named), as you iterate through with each you can grab those attributes using .attr(), and then store the final string in your 2d array.

Word. Thanks.

  • 0


(function store(){
var arrayToStore = [['',''],['','']];
var $strings = $('form input');
$strings.each(function(){
var x = $(this).attr('data-loc1');
var y = $(this).attr('data-loc2');
arrayToStore[x][y] = $(this).val();
});
console.log(arrayToStore);
})();
[/CODE]

A better example...

  • 0

I keep getting an error when I try to use multidimensional arrays.

Here is my form:

<form>
	<table>
		<tr>
			<th> </th>
			<th>Independent</th>
			<th>Pass</th>
			<th>Fail</th>
		</tr>
		<tr>
			<th>Data Labels</th>
			<td><input type="textbox" data-row="0" data-col="0" /></td>
			<td><input type="textbox" data-row="0" data-col="1" /></td>
			<td><input type="textbox" data-row="0" data-col="2" /></td>
		</tr>
		<tr>
			<th>Data Row 1</th>
			<td><input type="textbox" data-row="1" data-col="0" /></td>
			<td><input type="textbox" data-row="1" data-col="1" /></td>
			<td><input type="textbox" data-row="1" data-col="2" /></td>
		</tr>
		<tr>
			<th>Data Row 2</th>
			<td><input type="textbox" data-row="2" data-col="0" /></td>
			<td><input type="textbox" data-row="2" data-col="1" /></td>
			<td><input type="textbox" data-row="2" data-col="2" /></td>
		</tr>

		</table>
	</form>
	<p><input type="button" value="Run Regression" onClick="ProcessButtonClick()"/></p>

Here is my javascript:

   	 function ProcessButtonClick() {
			var arrayToStore = [['',''],['','']];
			var $strings = $('form input');
			$strings.each(function(){
				var x = parseInt($(this).attr('data-row'));
				var y = parseInt($(this).attr('data-col'));
				arrayToStore[x][y] = $(this).val();
			});
			console.log(arrayToStore);
}

I get this error in the console from Firebug:

TypeError: can't convert undefined to object

arrayToStore[x][y] = $(this).val();

If I'm only addressing 1 index, it works (i.e., arrayToStore[x] = $(this).val(); does not give me an error but doesn't give me the right output obviously).

Thank you for your input and time.

  • 0

Its an array initialization problem... once I sized it correctly when dimensioning the array variable it worked fine:

var arrayToStore = [['','',''],['','',''],['','','']]

I did not think that Javascript arrays had to be strictly dimensioned... Is there a short hand for this? I would think new Array(3,3) or something would look better...

  • 0

#

# CORRECT WAY TO INSTANTIATE AN ARRAY WITHOUT DIMENSION

#

var arrayToStore = [];

#

# PROBLEM

#

var arrayToStore = [['',''],['','']];

#

# REASON

#

IF you instantiate the array with only the above "problem" dimensions and do not correct the length beyond this, they will be truncated.

  • 0

Its an array initialization problem... once I sized it correctly when dimensioning the array variable it worked fine:

var arrayToStore = [['','',''],['','',''],['','','']]

I did not think that Javascript arrays had to be strictly dimensioned... Is there a short hand for this? I would think new Array(3,3) or something would look better...

I had worked that code up in a fiddle and was getting the same error, hence why I posted it with ['','']. The general consensus seems to be to create a helper fuction that, given a number x, can push x number of blank objects into the array which you can then fill.

Or... just use an object. It's certainly the preferred way in JS unless you really need an array of arrays.

#

# CORRECT WAY TO INSTANTIATE AN ARRAY WITHOUT DIMENSION

#

var arrayToStore = [];

#

# PROBLEM

#

var arrayToStore = [['',''],['','']];

#

# REASON

#

IF you instantiate the array with only the above "problem" dimensions and do not correct the length beyond this, they will be truncated.

If you do arrayToStore = [] and then try to set arrayToStore[0][0] = something, you'll get the same error.

  • 0

If you gave me an example of how you would like the content it might make it easier but off the top of my mind - how does this work?


var arrayData = [];

function ProcessButtonClick() {

var $strings = $('form input');

$strings.each(function(){

var arrayParent = [];
var arrayChild = [];

var x = parseInt($(this).attr('data-row'));
var y = parseInt($(this).attr('data-col'));

arrayChild[x] = $(this).val();
arrayParent[y].push(arrayChild);
arrayData.push(arrayParent)

});



}
[/CODE]

  • 0

tim_s - I get this error:

TypeError: arrayParent[y] is undefined

arrayParent[y].push(arrayChild);

Seems like the only way for me to get it to work is to declare the full size of the array... in just about every language you can initialize the size of an array directly but for some reason this doesn't seem possible in Javascript unless I'm missing something.

In the end, the size of my table is fixed so dimensioning out the variable before hand is fine.

  • 0

Seems like the only way for me to get it to work is to declare the full size of the array... in just about every language you can initialize the size of an array directly but for some reason this doesn't seem possible in Javascript unless I'm missing something.

In the end, the size of my table is fixed so dimensioning out the variable before hand is fine.

You're not, as I mentioned, it's not a preferred way of doing things in JS. If you must, this will work:


<script>
var multidArray = function(y){
var array = [];
for(i=0;i<y;i++){
array.push(['example', 'array']);
}
return array;
}
var newArray = multidArray(6);
newArray[1][0] = ['now', 1,1];
newArray[1][1] = 'modified';
console.log(newArray);
</script>
[/CODE]

However, in JS, this is preferable:

[CODE]
var better = {};
better[0] = {1: 'this', 2 : 'will', 3: 'work', 4: 'much', 5: 'better'};
console.log(better[0][1]); // will log 'this'
[/CODE]

  • 0

Well..its all moot because I can't get the input array into my web service.... apparently arrays of strings are a supported output (in JSON format) but not a supported input. I'll have to turn my table into CSV and then program my web service accordingly.

This topic is now closed to further replies.
  • Posts

    • Nearly half of American adults now use AI, but concerns are also growing by Hamid Ganji Since the launch of ChatGPT in 2022, the way people research, get their news, and perform routine tasks has changed dramatically. Now, almost everything around us has a touch of AI, and companies are trying to embed it into nearly every product and service they offer. With that in mind, new research shows how Americans are actually adopting this change and using AI in their everyday lives. According to new research conducted by the Pew Research Center, 49% of American adults now use AI chatbots like ChatGPT or Gemini. This marks a significant increase over last year, when only 33% of American adults reported using AI. Additionally, four in ten U.S. adults (42%) said they use AI tools to research information, while 38% said they use these tools to handle tasks at work. Entertainment, image and video editing, and getting medical advice are among the other ways Americans are using AI. Moreover, ChatGPT dominates the U.S. AI market, with 44% of respondents saying they use OpenAI's chatbot. Gemini follows at 24%, while Copilot and Meta AI account for 17% and 14%, respectively. Respondents also said that AI chatbots generally have a positive impact on their productivity and how informed they are. But when it comes to AI’s impact on society, Americans remain largely skeptical. About 40% of American adults believe AI will be more harmful than beneficial to society over the next 20 years. Additionally, 31% expect AI to have a negative effect on them personally. Another 31% of respondents say AI could be equally positive and negative. As for data security, pessimism remains high: 71% of respondents say AI will make their personal information less secure, while only 3% believe it will make their data more secure. American adults also largely lack confidence in both the government and AI companies when it comes to regulating and developing AI. About 67% of Americans have little to no confidence in the U.S. government’s ability to regulate AI effectively. Six in ten adults are also not confident that U.S. companies will develop and use these tools responsibly.
    • MultiOS-USB 0.11.1 by Razvan Serea MultiOS-USB is a versatile, open-source utility designed to create multiboot USB drives capable of hosting multiple operating systems on a single portable device. The project simplifies the process of building a bootable USB by automating the configuration of various boot loaders and file systems, enabling users to install and run diverse operating systems, including Windows, Linux distributions, and diagnostic tools, directly from one drive. It supports ISO booting and persistence, which allows changes made during live sessions to be retained, making it ideal for testing, troubleshooting, or system recovery. Features: BIOS and UEFI support Secure Boot support (boot, manage uefi keys) Load UEFI drivers Launch .efi executables and other boot loaders Boot Linux from .iso images Boot WinPE from bootable .wim images Boot Windows 10/11 installer from ISO (currently, SB must be disabled during installation) Boot Linux installer from network (experimental) Boot locally installed systems: Linux, Windows Automatically update configuration files Without background services exFAT file system support Automatic detection of compatible ISO images (GRUB loopback) Support for systems without loopback support Allows customisation of ISO boot menu (for example: custom kernel options) Support for USB, SSD, nvme, mmcblk, loop, nbd and virtual disks Support for x86, x86_64 A list of tested ISO images can be found here MultiOS-USB 0.11.1 changelog: 68122b7: Fixed-release AUR package #63 fba0283: Update shim to 16.1 8c2ae95: Update grub to v2.14-1 ea15c1d: Update Memtest86+ to v8.10 162f4e6: Add secureblue (#71) b2da8ae: Add AerynOS (#74) ac6640e: Bump config.version 34e9ca6: Add Bluefin (#72) 7a10edd: Add Aurora (#66) cab701b: Update wimboot to v2.9.0-1 90da7f7: Fix Windows error: 0x80070001 - 0x4002F (#52) 2dea73d: Add Microsoft certificates 01f479e: Remove old efi_uga module Download: MultiOS-USB 0.11.1 | 5.3 MB (Open Source) View: MultiOS-USB Website | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • Latest Rufus update improves new Windows 11 install method by Taras Buria Pete Batard, the maker of Rufus, a very popular app for creating bootable Windows (and other OS) media, has released a new beta version of its app. Rufus 4.15 beta is now out, and while it offers no new features, there are all sorts of improvements and fixes, including for the new Windows 11 installation method that was introduced in version 4.14 in early May. The "Silent Windows 11 installation" is a new feature whose goal is to automate operating system installation. All you have to do is boot from the drive, and then Rufus takes over, doing all things for you, such as setting up a new account, skipping ads and prompts, and more. It is a very handy tool, but initially, it had some bugs and issues that required addressing. With version 4.15 beta, Rufus is fixing that, particularly a bug with installation failing at 75%, crashes on Snapdragon X-based PCs, and more. Here is the changelog: Rufus 4.15 beta is now available for download from its GitHub repository. If you have never used Rufus before, you can check out our guide here. It is a very useful utility to have, as it allows you to deal with plenty of Windows 11's annoyances, which are still there, despite Microsoft's ongoing efforts to fix them.
    • Microsoft fixes one of Excel Copilot's most frustrating limitations by Usama Jawad Microsoft began integrating Copilot into Excel a couple of years ago and has been upgrading it with new functionalities since then. While some changes have been controversial, Microsoft is hoping to win over users by allowing them to be more productive via Copilot. To that end, it has now announced a Copilot improvement that may actually be appreciated by people who use it regularly. Excel customers often use the Copilot prompt box to issue instructions to format and customize their data, but it can become quite tiring to keep repeating the same instructions again and again. Microsoft now allows you to define Copilot personalization rules for formatting, naming conventions, formulas, and report styles. These can be accessed via Settings > Personalization, where you can explain your rules in natural language like "Always format currency in USD with no decimals", and just let Copilot take care of the rest. Microsoft is going a step further in this direction by allowing you to set workbook rules too. These rules are stored as a .Rules sheet, and are preserved while the workbook is shared. This fosters collaboration while making sure that standard rules govern the Copilot editing experience across the organization. Other advantages of this capability include pointing it to specific examples, defining dynamic formulas, and referencing an entire sheet and asking Copilot to infer rules based on that. You can leverage this feature by opening Copilot in Excel, clicking on "+", and selecting Create workbook rules. If you have an existing .Rules sheet, you can simply start listing the rules in column A as well. Personalization features are available to all Copilot in Excel users across the web, Mac, and Windows. Meanwhile, workbook rules are currently being previewed for Windows and Mac customers on the Insiders channel. General availability is scheduled after a few weeks, but a concrete date is currently unknown. Overall, the Excel capability is quite similar to ChatGPT's memory features, which allow you to permanently store items in the AI model's context window.
  • Recent Achievements

    • One Month Later
      Vincian earned a badge
      One Month Later
    • First Post
      Jocimo earned a badge
      First Post
    • Week One Done
      suprememobiles48 earned a badge
      Week One Done
    • One Month Later
      Windows Guy earned a badge
      One Month Later
    • One Month Later
      Prasann earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      510
    2. 2
      +Edouard
      172
    3. 3
      PsYcHoKiLLa
      90
    4. 4
      Steven P.
      76
    5. 5
      neufuse
      68
  • Tell a friend

    Love Neowin? Tell a friend!