ChatGPT解决这个技术问题 Extra ChatGPT

使用 jQuery 从 JavaScript 对象中添加选项的最佳方法是什么?

使用 jQuery 从 JavaScript 对象向 <select> 添加选项的最佳方法是什么?

我正在寻找不需要插件的东西,但我也会对那里的插件感兴趣。

这就是我所做的:

selectValues = { "1": "test 1", "2": "test 2" };

for (key in selectValues) {
  if (typeof (selectValues[key] == 'string') {
    $('#mySelect').append('<option value="' + key + '">' + selectValues[key] + '</option>');
  }
}

一个干净/简单的解决方案:

这是经过清理和简化的 version of matdumsa's

$.each(selectValues, function(key, value) {
     $('#mySelect')
          .append($('<option>', { value : key })
          .text(value));
});

与 matdumsa 相比的更改:(1) 删除了 append() 中选项的关闭标记,(2) 将属性/属性作为 append() 的第二个参数移动到映射中。

也许有帮助:texotela.co.uk/code/jquery/select(在我偶然发现这个问题后对我有帮助)
上面列出的清理版本仅适用于 Jquery 1.4+。对于旧版本,请使用 matdumsa 的答案中的那个
value : key } 应该是 { "value" : key },如 matdumsa 的回答所示。
我不这么认为,因为 value 是一个字符串(并且是硬编码的),它不需要被引用。
标题应该改为“使用 jQuery 从 JSON 对象的选择中添加选项的最佳方法是什么?

P
Peter Mortensen

与其他答案相同,采用 jQuery 方式:

$.each(selectValues, function(key, value) {   
     $('#mySelect')
         .append($("<option></option>")
                    .attr("value", key)
                    .text(value)); 
});

我首先将 $("#mySelect") 分配给一个 var,否则每次在循环内调用 $("#mySelect") 非常浪费,更新 DOM 也是如此。请参阅 artzstudio.com/2009/04/jquery-performance-rules/… 处的第 3 点和第 6 点
P
Peter Mortensen
var output = [];

$.each(selectValues, function(key, value)
{
  output.push('<option value="'+ key +'">'+ value +'</option>');
});

$('#mySelect').html(output.join(''));

这样,您只需“触摸 DOM”一次。

我不确定最新行是否可以转换为 $('#mySelect').html(output.join('')) 因为我不知道 jQuery 内部(也许它在 html()方法)


您的方法显然比上面的“正确”答案更快,因为它也使用较少的 jQuery。
如果 key 中包含一些引号或 >, <,则会中断。
A
Aakash

这稍微更快更干净。

var selectValues = {“1”:“测试 1”,“2”:“测试 2”}; var $mySelect = $('#mySelect'); // $.each(selectValues, function(key, value) { var $option = $("


它认为缓存 `$('#mySelect')` 是一个更好的主意,这样您在循环之前只查找一次。目前它正在 DOM 中搜索每个选项的元素。
P
Pixelomo

jQuery

var list = $("#selectList");
$.each(items, function(index, item) {
  list.append(new Option(item.text, item.value));
});

香草 JavaScript

var list = document.getElementById("selectList");
for(var i in items) {
  list.add(new Option(items[i].text, items[i].value));
}

N
Nickolay

如果您不必支持旧的 IE 版本,使用 Option constructor 显然是要走的路,a readable and efficient solution

$(new Option('myText', 'val')).appendTo('#mySelect');

它在功能上等同于,但比:

$("<option></option>").attr("value", "val").text("myText")).appendTo('#mySelect');

P
Peter Mortensen

这看起来更好,提供了可读性,但比其他方法慢。

$.each(selectData, function(i, option)
{
    $("<option/>").val(option.id).text(option.title).appendTo("#selectBox");
});

如果你想要速度,最快(经过测试!)的方法是这样,使用数组,而不是字符串连接,并且只使用一个附加调用。

auxArr = [];
$.each(selectData, function(i, option)
{
    auxArr[i] = "<option value='" + option.id + "'>" + option.title + "</option>";
});

$('#selectBox').append(auxArr.join(''));

m
mpapec

@joshperry's answer 的改进:

似乎普通的 .append 也可以按预期工作,

$("#mySelect").append(
  $.map(selectValues, function(v,k){

    return $("<option>").val(k).text(v);
  })
);

或更短,

$("#mySelect").append(
  $.map(selectValues, (v,k) => $("<option>").val(k).text(v))
  // $.map(selectValues, (v,k) => new Option(v, k)) // using plain JS
);

A
Animism

所有这些答案似乎都不必要地复杂。所有你需要的是:

var options = $('#mySelect').get(0).options;
$.each(selectValues, function(key, value) {
        options[options.length] = new Option(value, key);
});

那是完全跨浏览器兼容的。


P
Pang

请注意...我在 Android 2.2(Cyanogen 7.0.1)手机(T-Mobile G2)上使用带有 PhoneGap 1.0.0 的 jQuery Mobile 1.0b2,并且根本无法使用 .append() 方法。我必须使用 .html() 如下:

var options;
$.each(data, function(index, object) {
    options += '<option value="' + object.id + '">' + object.stop + '</option>';
});

$('#selectMenu').html(options);

H
HoldOffHunger
 var output = [];
 var length = data.length;
 for(var i = 0; i < length; i++)
 {
    output[i++] = '<option value="' + data[i].start + '">' + data[i].start + '</option>';
 }

 $('#choose_schedule').get(0).innerHTML = output.join('');

我已经进行了一些测试,我相信这可以最快地完成这项工作。 :P


N
Nick Josevski

有一种使用 Microsoft Templating approach 的方法,目前正在提议将其包含到 jQuery 核心中。使用模板功能更强大,因此对于最简单的场景,它可能不是最佳选择。有关更多详细信息,请参阅 Scott Gu 的文章概述了这些功能。

首先包含模板 js 文件,可从 github 获得。

<script src="Scripts/jquery.tmpl.js" type="text/javascript" />

接下来设置模板

<script id="templateOptionItem" type="text/html">
    <option value=\'{{= Value}}\'>{{= Text}}</option>
</script>

然后使用您的数据调用 .render() 方法

var someData = [
    { Text: "one", Value: "1" },
    { Text: "two", Value: "2" },
    { Text: "three", Value: "3"}];

$("#templateOptionItem").render(someData).appendTo("#mySelect");

blogged更详细地介绍了这种方法。


P
Peter Mortensen

我做了这样的东西,loading a dropdown item via Ajax。上面的响应也是可以接受的,但是尽可能少地修改 DOM 以获得更好的性能总是好的。

因此,与其在循环中添加每个项目,不如在循环中收集项目并在完成后附加它。

$(data).each(function(){
    ... Collect items
})

附加它,

$('#select_id').append(items); 

甚至更好

$('#select_id').html(items);

H
HoldOffHunger

简单的方法是:

$('#SelectId').html("<option value='0'>select</option><option value='1'>Laguna</option>");

j
joshperry

大多数其他答案使用 each 函数来迭代 selectValues。这需要为每个元素调用 append ,并且在单独添加每个元素时触发重排。

将此答案更新为更惯用的功能方法(使用现代 JS)可以形成为仅调用一次 append,并使用 map 创建一个 option 元素数组和一个 Option 元素构造函数。

使用 Option DOM 元素应减少函数调用开销,因为 option 元素在创建后不需要更新,并且 jQuery 的解析逻辑不需要运行。

$('mySelect').append($.map(selectValues, (k, v) => new Option(k, v)))

如果您创建一个新的选项对象的工厂实用程序函数,这可以进一步简化:

const newoption = (...args) => new Option(...args)

然后可以直接将其提供给 map

$('mySelect').append($.map(selectValues, newoption))

以前的配方

因为 append 还允许将值作为可变数量的参数传递,所以我们可以预先创建 option 元素列表 map 并使用 apply 在单个调用中将它们作为参数附加。

$.fn.append.apply($('mySelect'), $.map(selectValues, (k, v) => $("<option/>").val(k).text(v)));

看起来在更高版本的 jQuery 中,append 也接受一个数组参数,这可以稍微简化一下:

$('mySelect').append($.map(selectValues, (k, v) => $("<option/>").val(k).text(v)))

R
Rohan Ashik
function populateDropdown(select, data) {   
    select.html('');   
    $.each(data, function(id, option) {   
        select.append($('<option></option>').val(option.value).html(option.name));   
    });          
}   

它适用于 jQuery 1.4.1。

有关使用 ASP.NET MVC 和 jQuery 使用动态列表的完整文章,请访问:

Dynamic Select Lists with MVC and jQuery


M
Michail

Chrome (jQuery 1.7.1) 中的这个解决方案存在排序问题(Chrome 按名称/编号对对象属性进行排序?)所以为了保持顺序(是的,这是对象滥用),我改变了这个:

optionValues0 = {"4321": "option 1", "1234": "option 2"};

对此

optionValues0 = {"1": {id: "4321", value: "option 1"}, "2": {id: "1234", value: "option 2"}};

然后 $.each 看起来像:

$.each(optionValues0, function(order, object) {
  key = object.id;
  value = object.value;
  $('#mySelect').append($('<option>', { value : key }).text(value));
}); 

P
Peter Mortensen

我建议不要在任何地方重复相同的代码,而是编写自己的 jQuery 函数,例如:

jQuery.fn.addOption = function (key, value) {
    $(this).append($('<option>', { value: key }).text(value));
};

然后添加一个选项只需执行以下操作:

$('select').addOption('0', 'None');

k
keios

您可以使用以下代码迭代您的 json 数组

$('<option/>').attr("value","someValue").text("Option1").appendTo("#my-select-id");


P
Peter Mortensen

$.each 比 for 循环慢 每次,DOM 选择都不是循环中的最佳实践 $("#mySelect").append();

所以最好的解决方案如下

如果 JSON 数据 resp

[
    {"id":"0001", "name":"Mr. P"},
    {"id":"0003", "name":"Mr. Q"},
    {"id":"0054", "name":"Mr. R"},
    {"id":"0061", "name":"Mr. S"}
]

用它作为

var option = "";
for (i=0; i<resp.length; i++) {
    option += "<option value='" + resp[i].id + "'>" + resp[i].name + "</option>";
}
$('#mySelect').html(option);

D
DiverseAndRemote.com

还有另一种方法:

var options = [];    
$.each(selectValues, function(key, value) {
    options.push($("<option/>", {
        value: key,
        text: value
    }));
});
$('#mySelect').append(options);

我看到你在这里做了什么......你接受了缓存 $('#mySelect') 的建议,然后重构了@rocktheroad 答案......无论如何,这是更实用的解决方案
C
Christian Roman
if (data.length != 0) {
    var opts = "";
    for (i in data)
        opts += "<option value='"+data[i][value]+"'>"+data[i][text]+"</option>";

    $("#myselect").empty().append(opts);
}

这在第一次构建一个巨大的字符串之后只操作一次 DOM。


您可以通过将 $("#myselect").empty().append(opts); 替换为 getElementById('myselect').innerHtml = opts; 来进一步优化它并完全避免使用 jQuery
P
Peter Mortensen

这就是我对二维数组所做的:第一列是第 i 项,添加到 <option>innerHTML。第二列是record_id i,添加到<option>value

PHP $items = $dal->get_new_items(); // 从数据库中获取数据 $items_arr = array(); $i = 0; foreach ($item as $item) { $first_name = $item->first_name; $last_name = $item->last_name; $date = $item->日期; $show = $first_name 。 “”。 $姓氏。 “,”。 $日期; $request_id = $request->request_id; $items_arr[0][$i] = $show; $items_arr[1][$i] = $request_id; $i++; } 回声 json_encode($items_arr); JavaScript/Ajax function ddl_items() { if (window.XMLHttpRequest) { // Internet Explorer 7+、Firefox、Chrome、Opera 和 Safari 的代码 xmlhttp=new XMLHttpRequest(); } else{ // Internet Explorer 6 和 Internet Explorer 5 的代码 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { var arr = JSON.parse(xmlhttp.responseText); var lstbx = document.getElementById('my_listbox'); for (var i=0; i


P
Peter Mortensen

尽管之前的答案都是有效的答案 - 最好先将所有这些附加到 documentFragmnet,然后将该文档片段作为元素附加到...

请参阅John Resig's thoughts on the matter...

类似于以下内容:

var frag = document.createDocumentFragment();

for(item in data.Events)
{
    var option = document.createElement("option");

    option.setAttribute("value", data.Events[item].Key);
    option.innerText = data.Events[item].Value;

    frag.appendChild(option);
}
eventDrop.empty();
eventDrop.append(frag);

R
Rohan Ashik

可以在此处找到 jQuery 插件:Auto-populating Select Boxes using jQuery & AJAX


D
DW333

我发现这很简单而且效果很好。

for (var i = 0; i < array.length; i++) {
    $('#clientsList').append($("<option></option>").text(array[i].ClientName).val(array[i].ID));
};

P
Peter Mortensen

JSON 格式:

[{
    "org_name": "Asset Management"
}, {
    "org_name": "Debt Equity Foreign services"
}, {
    "org_name": "Credit Services"
}]

以及用于在 Ajax 成功时将值填充到 Dropdown 的 jQuery 代码:

success: function(json) {
    var options = [];
    $('#org_category').html('');  // Set the Dropdown as Blank before new Data
    options.push('<option>-- Select Category --</option>');
    $.each(JSON.parse(json), function(i, item) {
        options.push($('<option/>',
        {
           value: item.org_name, text: item.org_name
        }));
    });
    $('#org_category').append(options);  // Set the Values to Dropdown
}

P
Peter Mortensen

使用 $.map() 函数,您可以以更优雅的方式执行此操作:

$('#mySelect').html( $.map(selectValues, function(val, key){
    return '<option value="' + val + '">'+ key + '</option>';
}).join(''));

这有点短,但一个问题是处理 val 和 key vars 的转义,而接受的答案确实如此。
S
Satyendra Yadav
<!DOCTYPE html>
<html lang="en">
<head>
  <title>append selectbox using jquery</title>
  <meta charset="utf-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

  <script type="text/javascript">
    function setprice(){
        var selectValues = { "1": "test 1", "2": "test 2" };
        $.each(selectValues, function(key, value) {   
     $('#mySelect')
         .append($("<option></option>")
                    .attr("value",key)
                    .text(value)); 
});

    }
  </script>
</head>
<body onload="setprice();">


      <select class="form-control" id="mySelect">
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
  </select>


</body>
</html>

E
Erick Asto Oblitas

我将两个最佳答案组合成一个很好的答案。

var outputConcatenation = [];

$.each(selectValues, function(i, item) {   
     outputConcatenation.push($("<option></option>").attr("value", item.key).attr("data-customdata", item.customdata).text(item.text).prop("outerHTML"));
});

$("#myselect").html(outputConcatenation.join(''));

L
Lokesh thakur
$.each(selectValues, function(key, value) {
    $('#mySelect').append($("<option/>", {
        value: key, text: value
    }));
});