【问题标题】:jQuery: how to create variables for each item in arrayjQuery:如何为数组中的每个项目创建变量
【发布时间】:2014-05-19 11:49:05
【问题描述】:

我正在使用以下代码创建一个数组。

到目前为止,单个函数工作正常,我对循环的唯一问题是如何从数组中的每个项目动态创建变量(nameX 和 dataX)。

示例: 我的数组是[item1,item2,item3]。在这种情况下,变量应该是 name1、data1、name2、data2、name3、data3(nameX 和 dataX 暂时只是占位符)。

我的代码:

//get unique items
var inputSearch = new Array();
$('td.searchTerm').each(function() {
    if( ($(this).text() != '') && ($(this).text() != ' ') ) {
        if(inputSearch.indexOf($(this).text()) == -1) {
            inputSearch.push( $(this).text() );
        }
    }
});

//loop through array to get volumes per item
var i;
for (i = 0; i < inputSearch.length; i++) {
    var nameX = inputSearch[i].replace(/\s+/g, '');
    var dataX = [];
    var xSum = 0;
    $('#myTable tbody tr').each(function() {
        if ($(this).find('td:contains(' + nameX + ')').length === 0) {
            dataX.push(0);
        } else {
            xSum = 0;
            $(this).find('td:contains(' + nameX + ')').each(function() {
                 xSum += parseInt($(this).next('td').text());
            });

            dataX.push(xSum);
        }
    });
}

更新:我找到了一种动态创建名称变量的方法,所以现在只缺少数据变量:

window['name' + i.toString()] = inputSearch[i].replace(/\s+/g, '');

非常感谢您提供的任何帮助,蒂姆。

【问题讨论】:

  • "在这种情况下,变量应该是 name1, data1, name2, data2, name3, data3" - 你绝对不希望这样。
  • 不管怎么称呼它们,但它们需要命名不同,以免相互覆盖。
  • 你还是不想这样。您永远不想使用任何类型的编号变量,尤其是数量不定的变量。这就是数组的用途。
  • 请添加您想要“编号”变量的目的,所以也许我们可以使用数组帮助解决它。数组本质上就是这样,编号的变量,只是它们的名字是数组[x]
  • 我需要两件事:唯一项目列表(当前是我的第一个数组)+ 这些项目旁边的值列表(当前是我的第二个数组)。这两个都需要作为单独的列表,而不是组合在一起。

标签: jquery arrays loops each


【解决方案1】:

正如我在 cmets 中所说,不要试图创建“变量”。这条道路上只有痛苦和苦难。

这里有一种方法可以解决您似乎正在尝试的问题,而无需求助于丑陋的黑客。

var searchTerm = {};

$('td.searchTerm').each(function () {
    var term = $.trim( $(this).text() ), 
        name = term.replace(/\s+/g, '_');

    // prevent empty or non-unique entries
    if ( !term || searchTerm.hasOwnProperty(term) ) return;

    // sum up table values for the current term
    searchTerm[term] = 0;
    $('#myTable tbody td:contains(' + name + ')').each(function () {
        searchTerm[term] += parseInt( $(this).next('td').text(), 10 );
    });
});

会给你这样的东西:

searchTerm = {
    "foo": 10,
    "bar": 20,
    "baz": 0
};

考虑适当地处理混合大小写。目前fooFoo 是不同的术语,可能是您需要的,也可能不是。

extend jQuery with a case-insensitive :contains selector 有一个简单的方法。

【讨论】:

  • 谢谢。有没有办法可以访问这个数组中的数字(10、20、0)?我需要将这些与项目名称分开。
  • 填充一个单独的数组有什么问题,就像我在对您的问题的评论中指出的那样?
猜你喜欢
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 2014-07-24
  • 2019-11-09
相关资源
最近更新 更多