将javascript数组从multidimesional转移到关联

时间:2017-05-18 13:58:51

标签: javascript arrays

我有一个从本地数据库中提取的数组。

var data = [
  ['09-08-2017', '62154', 'Approved'],
  ['09-08-2017', '62155', 'Approved'],
  ['08-25-2017', '61922', 'Approved'],
  ['08-25-2017', '61923', 'Approved'],
  ['08-18-2017', '61949', 'Approved'],
  // ...
];

...等等,大约250个不同的条目。

data [0] [0]是工作周的日期,我们每周都对应于一周的星期五。

data [0] [1]是作业编号,每个作业编号都是唯一的,但每周可以有多个作业编号。

data [0] [2]是每个工作状态需要保留相应工作号的工作状态。

我本来要做的是将数组从它的方式转换为一个移位数组,该数组包含与相应作业数据相关的所有作业编号和状态。

可能是这样的事情:

data['09-08-2017'] = ['62154', 'Approved'], ['62155', 'Approved'];

甚至是可能的对象

data['09-08-2017'] = { jobNumber: '62154', jobState: 'Approved' };

但是我甚至不百分之百确定如何初始化这样的东西,而且我甚至不太确定什么是转换它的好方法。我可以提供任何帮助或建议。先感谢您!

修改  我发现为什么我的数组最初格式化得如此奇怪。当我第一次弄清楚如何将数组从php转移到javascript时,我看到有人一直在使用

var data = <?php json_encode(print_r($data)); ?> ;

所以我决定尝试它并且它有效,但显然它给了我一种难以使用的奇怪格式。所以我做了一些研究并将其改为

var data = <?php echo json_encode(array_values($data)); ?>;

现在它可以工作,并且还为我的数组提供了一种更易于操作的格式。

2 个答案:

答案 0 :(得分:4)

您可以通过迭代外部数组并使用日期构建数组来转换数组。然后推一个新对象。

&#13;
&#13;
@BeforeClass
&#13;
var data = [['09-08-2017', '62154', 'Approved'], ['09-08-2017', '62155', 'Approved'], ['08-25-2017', '61922', 'Approved'], ['08-25-2017', '61923', 'Approved'], ['08-18-2017', '61949', 'Approved']],
    object = data.reduce(function (r, a) {
        (r[a[0]] = r[a[0]] || []).push({ jobNumber: a[1], jobState: a[2] });
        return r;
    }, Object.create(null));

console.log(object);
&#13;
&#13;
&#13;

答案 1 :(得分:2)

JavaScript没有“关联数组”,它有对象和(从ES2015开始)Map

听起来您希望将数组数组转换为具有以日期命名的属性的对象,其值是具有作业编号和状态的对象。如果是,则使用{}创建对象,例如:

var obj = {};

...并在它们上设置属性,并使用括号表示日期,因为它们不是有效的标识符名称:

obj["09-08-2017"] = {};

您可以使用对象初始值设定项创建从属对象,因此:

obj[entry[0]] = {
    jobNumber: entry[1],
    jobState:  entry[2]
};

但是,您不能拥有该结构,因为同一日期有多个条目。你可能有

{
    "08-09-2017": {
        12345: "Approved",
        67894: "Approved"
    }
}

E.g:

var data = [
    ["09-08-2017", 62154, "Approved"],
    ["09-08-2017", 12345, "Approved"],
    ["08-08-2017", 62155, "Approved"]
];
var obj = {};
data.forEach(function(entry) {
    var date = entry[0];
    if (!obj[date]) {
        obj[date] = {};
    }
    obj[date][entry[1]] = entry[2];
});
console.log(obj);