[英]Javascript order of an array. Is it random?
我需要能夠預測數組中對象的順序。 我的數組將由包含3個值,X軸,Y軸和一個值的數組組成。 Y軸對應於我在數組中添加的對象,因此,例如在添加“ Other
我需要確保這是數組中的第一個元素,否則我的數據將被混淆。 我不知道是否存在特定元素。
到目前為止,我對此有一個循環:
if (i.channel == '(Other)') {
var pv_on_session = i.pageviews/i.sessions
table_data.push([0, 0, pv_on_session.toFixed(2) ]) // pv/sess, other, pv
table_data.push([1, 0, parseInt(i.avg_time)])
table_cat.push('(Other)')
};
if (i.channel == 'Social') {
var pv_on_session = i.pageviews/i.sessions
table_data.push([0, 1, pv_on_session.toFixed(2) ]) // pv/sess, social, pv
table_data.push([1, 1, parseInt(i.avg_time)])
table_cat.push('Social')
};
if (i.channel == 'Direct') {
var pv_on_session = i.pageviews/i.sessions
table_data.push([0, 2, pv_on_session.toFixed(2) ]) // pv/sess, other, pv
table_data.push([1, 2, parseInt(i.avg_time)])
table_cat.push('Direct')
if (i.channel == 'Organic Search') {
var pv_on_session = i.pageviews/i.sessions
table_data.push([0, 3, pv_on_session.toFixed(2) ]) // pv/sess, other, pv
table_data.push([1, 3, parseInt(i.avg_time)])
table_cat.push('Organic Search')
};
if (i.channel == 'Referral') {
console.log('xx is: '+ i.avg_time)
var pv_on_session = i.pageviews/i.sessions
table_data.push([0, 4, pv_on_session.toFixed(2) ]) // pv/sess, other, pv
table_data.push([1, 4, parseInt(i.avg_time)])
table_cat.push('Referral')
};
etc
根據我的理解,如果通道(other)
存在,它將[0 (x axis), 0(y axis, so first element in the array so (other), value]
添加到數組中;如果不存在,它將跳過這並轉到下一個。
但是,當我打印table_cat
時,我以隨機(?)的順序獲取數組,例如Referral,Direct,Social,(Other),Organic Search
為什么要這樣做? 我想念的是什么?
EDITS:
所以我的數據看起來像這樣,但是我不知道可能有哪個頻道,但是我知道選項:
data =
[{
"channel": "(Other)",
"pageviews": 1388082,
"sessions": 314263,
"avg_time": 54.94890183937861
}, {
"channel": "Referral",
"pageviews": 364869,
"sessions": 50387,
"avg_time": 58.104753437736335
}, {
"channel": "Direct",
"pageviews": 92538,
"sessions": 22118,
"avg_time": 59.21658970091479
}, {
"channel": "Organic Search",
"pageviews": 23470,
"sessions": 4246,
"avg_time": 51.96215449005384
}, {
"channel": "Social",
"pageviews": 8317,
"sessions": 1931,
"avg_time": 58.63430399702078
}]
選項有:
// (Other) = 0
// Social = 1
// Direct = 2
// Organic Search = 3
// Referral = 4
// Paid Search = 5
// Email = 6
// Affiliates = 7
// Other Advertising = 8
// Display = 9
// Email = 10
我通過一個簡單的循環遍歷它們,例如:
data.forEach(function(i){
if (i.channel == '(Other)') {
....etc
您可以將一個對象用作所需數字的引用,並且僅使用一個if語句。
var options = {
'(Other)': 0,
'Social': 1,
'Direct': 2,
'Organic Search': 3,
'Referral': 4
};
if (i.channel in options) {
var pv_on_session = i.pageviews/i.sessions;
table_data.push([0, options[i.channel], pv_on_session.toFixed(2)]); // pv/sess, other, pv
table_data.push([1, options[i.channel], parseInt(i.avg_time)]);
table_cat.push(i.channel);
}
為了對數據數組進行排序,可以使用與上面相同的對象來獲取排序順序。
data.sort(function (a, b) {
return option[a.channel] - option[b.channel];
});
因此,對於誰通過Google到達這里。 我仍然不完全確定為什么我的數組沒有按照應有的順序排序,但是我設法通過從-1開始的簡單計數來解決這個問題。
像這樣:
var options = [];
var table_data = [];
var count = -1;
channels.forEach(function(i) {
options.push(i.channel)
if (options.includes(i.channel)) {
count += 1
var pv_on_session = i.pageviews / i.sessions
table_data.push([0, count, pv_on_session.toFixed(2)]) // pv/sess, other, pv
table_data.push([1, count, parseInt(i.avg_time)])
}
})
這表示我標記了@ nina-scholz的正確答案,因為它刪除了所有的if循環,並允許這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.