簡體   English   中英

js:帶有關聯數組的數組

[英]js: array with in an associative array

我正在嘗試為以下數據設置關聯數組:

name       date        alpha    beta
Andrew    12/08/07      2.3     1.4
            5/12/07         
            26/03/08    
____________________________________
Fred    3/09/07         2.1 1.1
        23/01/08
____________________________________

基本上,每個患者都會有一個名字和α,β值但他們去過醫生的多個日期。 我想的是跟隨名稱是主鍵,日期存儲在數組和alpha中,beta是與鍵相關聯的浮點值。

var info = [{ name: [{ dates: [ ], alpha: float, beta: float  }] }];

然后在讀取csv文件時填充此信息數組。 初始化這種關聯數組的正確格式是什么? 或者其他什么數據結構是表示這種數據的好方法?

提前致謝!

術語“關聯數組”幾乎從不用於JavaScript; 您可以使用對象(有時稱為“地圖”或“詞典”)作為名稱/值信息,或使用有序數據的數組。

看起來你想要一組患者對象,如下所示:

var patients = [
    {
        name: "Andrew",
        dates: [/*...the dates...*/],
        alpha: 2.3,
        beta: 1.4
    },
    {
        name: "Fred",
        dates: [/*...the dates...*/],
        alpha: 2.1,
        beta: 1.1
    }
];

您可能會或可能不想使用構造函數來創建這些對象,具體取決於您的需要,但是您可能沒有必要使用您提供的簡單數據。

編輯:由於每個患者都有一個唯一的名稱,而不是使用數組,您應該考慮使用單個對象,其中每個患者是由對象鍵標識的對象,例如:

var patientList = {
  andy: {},
  bob: {}
};

要將CSV文件中的數據導入此結構,您可能會考慮以下內容:

var csv = 'Andrew\t12/08/07\t1.2\t3.4\nAndrew\t15/09/08\t1.2\t3.4\nAndrew\t14/08/07\t1.2\t3.4\t\nBob\t18/09/08\t1.2\t3.4\nAndrew\t21/08/07\t1.2\t3.4\nDavid\t31/09/08\t1.2\t3.4\nAndrew\t22/08/07\t1.2\t3.4\t\nSam\t26/09/08\t1.2\t3.4';

// Split the CSV file at the carriage return.
var data = csv.split('\n');

// Recursive over the data with `map`, splitting each line up
// on the tabs and returning a patient object for each.
data = data.map(function (el) {
  var patient = el.split('\t');
  return {
    name: patient[0],
    date: patient[1],
    alpha: patient[2],
    beta: patient[3]
  }
});


function getListOfPatientNames(arr) {
  var newarr = [];

  // For each patient object return the patient name only
  newarr = arr.map(function (patient) {
    return patient.name;
  });

  // A quick way of filtering out duplicates
  return newarr.filter(function(elem, pos) {
    return newarr.indexOf(elem) == pos;
  });
}

// Return a unique list of names, and sort them.
var names = getListOfPatientNames(data).sort();

var patientList = {};

for (var i = 0, l = data.length; i < l; i++) {
  var name = data[i].name;

  // If the patient name doesn't exist in patientList yet
  if (!patientList[name]) {

    // Add a new patient object using the name as the key
    var newPatient = {
      dates: [data[i].date],
      alpha: data[i].alpha,
      beta: data[i].beta
    };
    patientList[name] = newPatient;
  } else {

    // If the patient already exists push the date to the dates array
    patientList[name].dates.push(data[i].date);
  }
}

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM