如何将选中/未选中的复选框值附加到发布数据

Posted

技术标签:

【中文标题】如何将选中/未选中的复选框值附加到发布数据【英文标题】:How to append checked/unchecked checkbox values to post data 【发布时间】:2018-12-19 23:52:43 【问题描述】:

javascript 中(可以使用 jQuery),我将如何转换对象数组:

// Array of objects.
var myArray = [  code: "X", selected: true ,  code: "Y", selected: false ,  code: "Z", selected: true  ];

变成二维值数组?:

var myArray[0][0] = "X";
myArray[0][1] = true;
myArray[1][0] = "Y";
myArray[1][1] = false;
myArray[2][0] = "Z";
myArray[2][1] = true;

我问是因为我在 AJAX 调用中发送数据时遇到了一些问题,该调用将序列化的表单数据与对象数组结合在一起。

我需要将所有数据映射到 View Model 服务器端:

public class MyViewModel

    public MyViewModel()
    
        selectedRelatedTaxes = new List<RelatedTax>();
    

    public string co  get; set; 
    public string category  get; set; 
    public string taxCode  get; set; 
    public List<RelatedTax> myArray  get; set; 


public class RelatedTax

    public string code  get; set; 
    public bool selected  get; set; 

这是试图将所有数据组合在一起的 JavaScript 函数:

function GetAllData() 
    var result = ;

    if (!$('#FormID'))
        return ;

    result = $('#FormID:not(input[data-function="partOfArray"])').serializeArray();

    var myArray = [];
    $('input[data-function="partOfArray"]').each(function (index) 
        var code = $(this).val();
        var selected = $(this).is(':checked');

        myArray.push( code: code, selected: selected );
    );

    if (result) 
        result.push( name: 'myArray', value: myArray );
    

    return result;

如果我使用上面的函数,我会在 AJAX 调用中得到这个数据:

数组未正确映射到列表服务器端。

如果我改用这个 JavaScript 函数:

function Test() 
    var myArray = [];
    $('input[data-function="partOfArray"]').each(function (index) 
        var code = $(this).val();
        var selected = $(this).is(':checked');

        myArray.push( code: code, selected: selected );
    );

    return  myArray: myArray ;

我在 AJAX 调用中得到这个数据:

数组确实映射到服务器端的列表。但这当然缺少所有其他数据。

第二张图片的数据格式是什么?对我来说,它看起来像一个二维数组。如何将我的数据数组与所有其他数据一起转换为该格式?

这是进行 AJAX 调用的代码:

function LoadAddCompanyTaxWizard(url) 
    var formData = GetAllData();

    $.ajax(
        
            cache: false,
            method: "POST",
            url: url,
            data: formData
        ,
        .error(...)
        .success(...),
        .complete(...)
    );

【问题讨论】:

问题出在其他地方。发布将数据发布到服务器的代码。 Converting Array of Objects into Array of Arrays的可能重复 下面有很多关于如何从对象数组转换为数组数组的好答案。但是,查看其余代码并不清楚为什么您没有首先制作您想要的数组。为什么不直接使用Array.push([code, selected ]) 开始? @SalmanA 我已经包含了进行 AJAX 调用的函数。 @HereticMonkey 我很抱歉标题确实让它重复了。更改标题以反映真正的潜在问题可能是最好的,尽管我真的不知道该标题是什么。 【参考方案1】:

我认为你需要修改代码如下:

function GetAllData() 
  // check if an element exists
  if ($('#FormID').length === 0) 
    return ;
  

  // use the :not filter correctly
  var result = $('#FormID input:not([data-function="partOfArray"])').serializeArray();

  $('#FormID input[data-function="partOfArray"]').each(function(index) 
    var code = $(this).val();
    var selected = $(this).is(':checked');
    result.push(
      name: "selectedRelatedTaxes[" + index + "][code]",
      value: code
    );
    result.push(
      name: "selectedRelatedTaxes[" + index + "][selected]",
      value: selected
    );
  );

  return result;

这是我复制表单的尝试:

function GetAllData() 
  // check if an element exists
  if ($('#FormID').length === 0) 
    return ;
  

  // use the :not filter correctly
  var result = $('#FormID input:not([data-function="partOfArray"])').serializeArray();

  $('#FormID input[data-function="partOfArray"]').each(function(index) 
    var code = $(this).val();
    var selected = $(this).is(':checked');
    result.push(
      name: "selectedRelatedTaxes[" + index + "][code]",
      value: code
    );
    result.push(
      name: "selectedRelatedTaxes[" + index + "][selected]",
      value: selected
    );
  );

  return result;


$("#FormID").on("submit", function(e) 
  e.preventDefault();
  console.log(GetAllData());
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<form id="FormID">
  <input name="category" value="State">
  <input name="co" value="CT0002">
  <input name="taxCode" value="AK">
  <input name="selectedRelatedTaxes" data-function="partOfArray" type="checkbox" value="AKSUI" checked="">
  <input name="selectedRelatedTaxes" data-function="partOfArray" type="checkbox" value="AKSUI-E">
  <input name="selectedRelatedTaxes" data-function="partOfArray" type="checkbox" value="FOO" checked="">
  <input name="selectedRelatedTaxes" data-function="partOfArray" type="checkbox" value="BAR">
  <input type="submit" value="Test Script">
</form>

【讨论】:

这对我有用!它在服务器端正确映射了所有内容。 i.imgur.com/TgC5Uip.png 是的,我猜是 XY 问题。【参考方案2】:

只需map 数组:

var myArray = [  code: "X", selected: true ,  code: "Y", selected: false ,  code: "Z", selected: true  ];

var result = myArray.map((code, selected) => ([code, selected]));
console.log(result);

【讨论】:

@mhodges 您的编辑不只是我答案的副本吗? (我在您编辑前 3 分钟回答了) 啊,没看到。记录下来,只有 2 分钟 xD【参考方案3】:

您可以使用.map()Object.values() 非常简单地做到这一点,如下所示:

var myArray = [  code: "X", selected: true ,  code: "Y", selected: false ,  code: "Z", selected: true  ];

console.log(myArray.map(obj => Object.values(obj)))

如果您需要保证数组中项目的顺序,您可以执行以下操作:

var myArray = [  code: "X", selected: true ,  code: "Y", selected: false ,  code: "Z", selected: true  ];

console.log(myArray.map((code, selected) => [code, selected]))

第二种方法的缺点是它不是动态的,您必须明确地对数组中的每个元素进行排序。但就一致的输出而言,它要安全得多。

由于您在问题中没有使用 ES6,因此非 ES6 版本将如下所示:

myArray.map(function (obj) 
  return [obj.code, obj.selected]
);

【讨论】:

Object.values()会保证正确的顺序吗? @MarkMeyer 不,Object.values 会以任意顺序返回值,因此不能依赖它。【参考方案4】:

我会使用reduce,两次。

    减少主数组。 使用它的键减少对象 将缩减后的对象值推送到当前数组中

var myArray = [  code: "X", selected: true ,  code: "Y", selected: false ,  code: "Z", selected: true  ];

let result = myArray.reduce((arr, itm, idx) => 
  arr.push(Object.values(itm).reduce((a, i) => a.concat(i), []))
  return arr
, [])

console.log(result[0][0])
console.log(result[0][1])
console.log(result[1][0])
console.log(result[1][1])
console.log(result[2][0])
console.log(result[2][1])

【讨论】:

这并不总是有效。您不能依赖Object.values[code, selected] 的顺序返回值数组——它以任意顺序返回值。为了安全起见,您必须明确引用对象的 codeselected 键,并且每次都以相同的顺序放置它们。 这不是太复杂了吗?!【参考方案5】:

这是在 JS 中创建二维数组的方法

var myArray = [];
    $('input[data-function="partOfArray"]').each(function (index) 
    var code = $(this).val();
    var selected = $(this).is(':checked');
    myArray.push([code, selected]);
);

这将创建您描述的数组:

var myArray[0][0] = "X";
myArray[0][1] = true;
myArray[1][0] = "Y";
myArray[1][1] = false;
myArray[2][0] = "Z";
myArray[2][1] = true;

【讨论】:

【参考方案6】:

你可以在这里找到很多 ES6 中的解决方案。

ES5 中的解决方案

var myArray =
[
    code: "X", selected: true,
    code: "Y", selected: false,
    code: "Z", selected: true 
];

var newArray = myArray.map(function(obj)return [obj.code, obj.selected]);

console.log(JSON.stringify(newArray, null, '\t'));

【讨论】:

我在 34 分钟前的回答中有一个 ES5 解决方案 @mhodges,O_o,不幸的是没有 sn-p 我没有看到它。

以上是关于如何将选中/未选中的复选框值附加到发布数据的主要内容,如果未能解决你的问题,请参考以下文章

选择多个复选框并附加其值

如何使用codeigniter将选中和未选中复选框的值更新为表

如何将一组选中/未选中的复选框值传递给 PHP 电子邮件生成器?

未选中复选框时发布复选框值[重复]

PHP jquery设置复选框值,如果选中或未选中并发布

如果选中复选框,如何将自动值插入编辑组件