2012-07-10 51 views
2

我有data-seatdata-row物业的div元素:获取文本并格式化

<div class='selected' data-seat='1' data-row='1'></div> 
<div class='selected' data-seat='2' data-row='1'></div> 
<div class='selected' data-seat='3' data-row='1'></div> 
<div class='selected' data-seat='1' data-row='2'></div> 
<div class='selected' data-seat='2' data-row='2'></div> 

我想打印友好的消息,选定座位:

var selectedPlaceTextFormated =''; 
$(".selected").each(function() { 

     var selectedPlace = $(this); 

     selectedPlaceTextFormated += "Row " + selectedPlace.attr("data-row") + " (seat " + selectedPlace.attr("data-seat") + ")\n"; 
    }); 
alert(selectedPlaceTextFormated); 

此代码工作得很好,表演以下内容:

Row 1 (seat 1) 
Row 1 (seat 2) 
Row 1 (seat 3) 
Row 2 (seat 1) 
Row 2 (seat 2) 

但是,我希望按行排组, .e我想要以下内容:

Row 1(seats: 1,2,3) 
Row 2(seats: 1,2) 

此外,按行数排序。我怎样才能做到这一点?
谢谢。 DEMO

+0

+1与爵士小提琴 – Thariama 2012-07-10 08:35:54

回答

3

下面是代码

var selectedPlaceTextFormated =''; 
var row_array = []; 

$(".selected").each(function() { 
    var selectedPlace = $(this); 
    if (!row_array[selectedPlace.attr("data-row")]){ 
     row_array[selectedPlace.attr("data-row")] = selectedPlace.attr("data-seat"); 
    } 
    else row_array[selectedPlace.attr("data-row")] += ','+selectedPlace.attr("data-seat"); 
}); 

for (row in row_array){ 
    alert("Row "+ row +"(seat " + row_array[row] + ")\n"); 
} 

而且这里的链接工作小提琴:http://jsfiddle.net/3gVHg/

+0

似乎也工作:) – jAndy 2012-07-10 08:39:37

2

首先,jQuery是一种足以自动抓取data-属性到其data expando对象,这意味着,你可以通过访问这些数据:

jQueryObject.data('seat'); 

例如。

您的实际问题可以得到解决像

var $selected  = $('.selected'), 
    availableRows = [ ], 
    selectedPlaceTextFormated = '', 
    currentRow, 
    currentSeats; 

$selected.each(function(_, node) { 
    if(availableRows.indexOf(currentRow = $(node).data('row')) === -1) { 
     availableRows.push(currentRow); 
    } 
}); 

availableRows.forEach(function(row) { 
    selectedPlaceTextFormated += 'Row ' + row + '('; 

    currentSeats = $selected.filter('[data-row=' + row + ']').map(function(_, node) { 
     return $(this).data('seat'); 
    }).get(); 

    selectedPlaceTextFormated += currentSeats.join(',') + ')\n'; 
}); 

的jsfiddle:http://jsfiddle.net/gJFJW/3/

+0

详细具体的问题+1工作答案 – Thariama 2012-07-10 08:38:55

+2

感谢'数据expando'和解决方案。 – user1260827 2012-07-10 08:46:03

1

你需要使用另一个变量来st排成一行,并相应地进行格式化。

var selectedPlaceTextFormated =''; 
var prevRow = 0; 
$(".selected").each(function() { 
    var selectedPlace = $(this); 
    var row = selectedPlace.attr("data-row"); 
    var seat = selectedPlace.attr("data-seat"); 
    if(prevRow == row){ 
     selectedPlaceTextFormated += "," + seat; 
    } 
    else{ 
     if(selectedPlaceTextFormated != ''){ 
      selectedPlaceTextFormated += ')\n'; 
     } 
     selectedPlaceTextFormated += "Row " + row + " (seat " + seat; 
     prevRow = row; 
    } 

}); 
selectedPlaceTextFormated += ')\n'; 
alert(selectedPlaceTextFormated); 

检查http://jsfiddle.net/nsjithin/R8HHC/

1

这可以用一些细微的修改现有的代码使用数组实现的;然后这些阵列用于构建一个字符串:

var selectedPlaceTextFormated = []; 
var textFormatted = ''; 
$(".selected").each(function(i) { 

    var selectedPlace = $(this); 
    var arr = []; 

    selectedPlaceTextFormated[selectedPlace.attr("data-row")] += "," + selectedPlace.attr("data-seat"); 

}); 

selectedPlaceTextFormated.shift(); 

for (var i = 0; i < selectedPlaceTextFormated.length; i++) { 
    var arr2 = selectedPlaceTextFormated[i].split(","); 
    arr2.shift(); 
    textFormatted += "Row " + (i + 1) + " seats: (" + arr2.join(",") + ")\n"; 
} 

alert(textFormatted); 

Demo

1

我只是这样做:

var text = []; 
$(".selected").each(function() { 
    var a = parseInt($(this).data('row'), 10), 
     b = $(this).data('seat'); 
    text[a] = ((text[a])?text[a]+', ':'')+b; 
}); 

var selectedPlaceTextFormated =''; 
$.each(text, function(index, elem) { 
    if (!this.Window) selectedPlaceTextFormated += "Row " + index + " (seat " + elem + ")\n"; 
}); 

alert(selectedPlaceTextFormated); 

FIDDLE