【问题标题】:Multidimensional Array in javascriptjavascript中的多维数组
【发布时间】:2015-02-14 10:03:26
【问题描述】:

我目前有这样的事情:

var selectAThing = {
        "ID" : "ProductName" ,
        "5" : "abc" ,
        "29" : "efg" ,
        "28" : "HIJ" ,
        "11" : "xyz"
        "23" : "efg" ,
        "15" : "HIJ" ,
        "40" : "xyz"
    };

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

现在显示如下:

<select>
    <option value="5">abc</option>
    <option value="11">abc</option>
    <option value="15">abc</option>
    <option value="23">abc</option>
    <option value="28">abc</option>
    <option value="29">abc</option>
    <option value="40">abc</option>
</select>

这是将在表单中多次使用的内容列表。
因此,创建了一个 js 数组并将其加载到所需的每个选择列表中。

现在我在每一行添加了重要性级别。如果级别为 1,它们将首先显示在选择列表中。

var selectAThing = {
        level : [ "id" : "thingname", "id" : "thingname"]
    };

var selectAThing = {
        1 : [ "5" : "abc", "29" : "efg"],
        2 : [ "28" : "HIJ" , "11" : "xyz"],
        3 : [ "23" : "efg" , "15" : "HIJ" , "40" : "xyz"]
    };

对于重要性级别,我想在选择列表的顶部显示最重要的内容,按第一级排序,下一个 ID。 像这样:

<select>
    <!-- importance level 1 -->
    <option value="5">abc</option>
    <option value="29">abc</option>
    <!-- importance level 2 -->
    <option value="28">abc</option>
    <option value="11">abc</option>
    <!-- importance level 3 -->
    <option value="23">abc</option>
    <option value="15">abc</option>
    <option value="40">abc</option>
</select>

现在我不确定如何将数组转换为选择列表,甚至数组是否正确!
:(
任何帮助!
提前谢谢!

【问题讨论】:

  • 请详细说明。所以你只想用你的“新”多维数组创建一个选择列表?是否要将这些选择字段按重要性级别归为一组?
  • @androidavid 我更改了描述的一些细节。列表的排序将是第一级然后是 ID 号。 :)

标签: javascript arrays arraylist multidimensional-array


【解决方案1】:

您的数据结构没有多大意义,您应该重新考虑它们的布局。

想想类似于数据库表的东西:

var selectAThing = [
    {id: "5", name: "abc"},
    {id: "29", name: "efg"},
    {id: "28", name: "HIJ"},
    {id: "11", name: "xyz"},
    {id: "23", name: "efg"},
    {id: "15", name: "HIJ"},
    {id: "40", name: "xyz"}
];

selectAThing.sort(function (a, b) {
    return sortAlpha(a.name, b.name);
});

$.each(selectAThing, function(i, thing) {
    $('<option>', { value: thing.id, text: thing.name }).appendTo('.mySelect');
});

使用优先级或任何其他属性扩展它变得微不足道:

var selectAThing = [
    {id: "15", name: "HIJ", priority: 3},
    {id: "23", name: "efg", priority: 3},
    {id: "40", name: "xyz", priority: 3},
    {id: "28", name: "HIJ", priority: 2},
    {id: "11", name: "xyz", priority: 2},
    {id:  "5", name: "abc", priority: 1},
    {id: "29", name: "efg", priority: 1}
];

selectAThing.sort(function (a, b) {
    if (a.priority === b.priority) {
        return sortAlpha(a.name, b.name);
    } else {
        return sortNum(a.priority, b.priority);
    }
});

$.each(selectAThing, function(i, thing) {
    $('<option>', {value: thing.id, text: thing.name}).appendTo('.mySelect');
});

助手:

function sortAlpha(a, b) {
    a = a.toLowerCase();
    b = b.toLowerCase();
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
}
function sortNum(a, b) {
    a = parseFloat(a);
    b = parseFloat(b);
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
}

【讨论】:

    【解决方案2】:

    该列表将有多长?它是静态的还是会随着时间而改变?如果它的静态只是按重要性对其进行排序并完成它。如果它不是静态的但不是太长,您可以在每次需要时对其进行排序,如果它不是静态的但很长,则必须始终保持排序(插入排序数组)。 这里有一些伪代码:

    var selectAThing = [
      {level:1, 5:"abc", 29:"efg"},
      {level:2, 28:"HIJ", 11:"xyz"},
      ...
    ];
    
    // sort on level (ascending)
    selectAThing.sort(function(a,b) {
       return a.level - b.level;
    });
    

    如果你想用字典 ({}) 来做,你必须这样做:

    var selectAThing = {
      1: [{"5" : "abc"}, {"29" : "efg"}],
      2: [...]
    };
    

    【讨论】:

    • 如果你还是要改变结构,那么这可能不是一个好的方法。我宁愿推荐{level: 1, entries: [...]} 而不是那种模糊的定义。
    • @JohnDoe90 列表不一定是静态的。但我将从 mysql 收集数据,管理员可以在其中更改/添加/编辑/删除列表的内容,尽管更改很少见。列表上会有超过 30 个选项,列表会被使用超过 10 次。
    猜你喜欢
    • 2012-09-21
    • 2017-05-24
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多