嵌套数组中的jQuery .each()

时间:2015-02-04 22:30:03

标签: javascript jquery arrays

我为长篇文章道歉,但我会告诉你完整的故事。我有一个页面列出了一些产品,下面每个都有一个小的jQueryUI日历来选择交货日期。我不会理解为什么,但我必须做我正在做的客户端脚本。

我正在使用jQuery循环遍历每个产品名称。对于每一个,它会检查一系列关键字,并在数组中的任何位置找到产品名称时采取措施。

结束操作将使用对相关日历日期选择器的调用并对其应用最小和最大日期(这很容易)。

我现在遇到的问题是我决定使用嵌套数组来表示产品名称和允许选择的日期。因此,我不仅仅是一系列关键字,而是:

var keywordArray = [
    //product name, start date, end date
    ["foo","2/1/2014","2/13/2014"],
    ["bar","2/7/2014","2/12/2014"]
];

所以“foo”只能在2/1到2/13之间交付。


鉴于此,我需要修改我的内部循环,但我还没弄清楚如何去做。当数组只是一个简单的关键字数组时,它工作得很好,但现在我需要在数组数组中测试每个数组的第一个元素(多么令人满意)。

function checkAllowedDates() {
    $("div[id^='delivery_product_name_']").each(function(index) {   //outer loop (each product name)

        str = $("div#delivery_product_name_"+parseInt(index+1)).text(); //gets text inside 'delivery_product_name_1', _2, etc...

        $.each(keywordArray,function(index,value){  //test all array values to see if any are in the product name

            if (str.toLowerCase().indexOf(value) >= 0) {    //contains a keyword
            console.log(str+ " contains the special keyword " + value);
            }
        });
    });
}

我尝试使用值[0],没有骰子。我google / binged如何使用嵌套数组,并找到了一些很好的例子,我可以使用普通的for循环来做,但我真的想在这上面使用jQuery。

如此短的形式:如何使用 $。each()循环遍历数组数组,并测试每个内部数组的第0个索引(产品名称字符串)以查看它是否匹配我的外循环的当前产品名称文本?

4 个答案:

答案 0 :(得分:1)

为什么不简单地使用更容易使用的数据结构,如:

var keywordObj = {
    foo: ["2/1/2014","2/13/2014"],
    bar: ["2/7/2014","2/12/2014"]
};

这样您就有了一个可以执行查找的键。这可以防止您根本不需要执行嵌套循环。您可以根据str这样的值来获取开始/结束日期:

var startDate = keywordObj[str][0];
var endDate = keywordObj[str][1];

您甚至可以使用嵌套对象来获取特定的startDate / endDate属性,例如

var keywordObj = {
    foo: {
        startDate: "2/1/2014",
        endDate: "2/13/2014"
    },
    bar: {
        startDate: "2/7/2014",
        endDate: "2/12/2014"
    }
};

然后访问:

var selectedItem = keywordObj[str];
console.log(selectedItem.startDate);
console.log(selectedItem.endDate);

总而言之,因为您没有构建数据以便于查找,所以您必须执行不必要的循环来查找数据结构中要查找的数据。这意味着当操作具有O(1)时,您的操作具有O(n)的操作复杂性。始终考虑您的数据结构以及如何设置它以最佳方式获取数据。

答案 1 :(得分:0)

这是你想要的吗?

$.each(arr, function(){
  console.log("outer loop")
  console.log(this)
  $.each(this, function(){
    console.log("inner loop")
    console.log(this)
  })
})

输出就像

outer loop
[1, 2]
inner loop
Number {[[PrimitiveValue]]: 1}
inner loop
Number {[[PrimitiveValue]]: 2}
outer loop
[3, 4]
inner loop
Number {[[PrimitiveValue]]: 3}
inner loop
Number {[[PrimitiveValue]]: 4}

答案 2 :(得分:0)

function checkAllowedDates() {
    $("div[id^='delivery_product_name_']").each(function(index) {   //outer loop (each product name)

        str = $("div#delivery_product_name_"+parseInt(index+1)).text(); //gets text inside 'delivery_product_name_1', _2, etc...

        $.each(keywordArray,function(index,value){  //test all array values to see if any are in the product name

            if (str.toLowerCase().indexOf(value[0]) >= 0) {    //contains a keyword
            console.log(str+ " contains the special keyword " + value[0]);
            }
        });
    });
}

希望它有所帮助。

答案 3 :(得分:0)

你走在正确的轨道上却错了

if (str.toLowerCase().indexOf(value[0]) >= 0) { 

它实际上应该是另一种方式

if (value.indexOf(str.toLowerCase()) >= 0) 

格式为

array.indexOf(searchElement[, fromIndex = 0])

更多信息和示例here

相关问题