将数组合并为单个数组

时间:2014-08-26 10:27:48

标签: javascript arrays

如果这是.NET,我会问如何将List<List<MyClass>转换为List<MyClass>。但是,我对javascript不是很了解,并且不知道如何使用Javascript术语来问这个问题!

我的javascript对象来自

enter image description here

创建为:

js_datasets.push({
"DataItem0": {
lzabel: "This",
data: [[1408710276000, null],[1408710276000, 15]]
},
"DataItem1": {
lzabel: "That",
data: [[1408710276000, null],[1408710276000, 15]]
},
});


js_datasets.push({
"DataItem22": {
lzabel: "And other",
data: [[1408710276000, null],[1408710276000, 5]]
},
"DataItem23": {
lzabel: "And lastly",
data: [[1408710276000, null],[1408710276000, 1]]
},
});

每个对象都是相同的&#34;类型&#34; (如果重要的话)。

我想创建一个列表,但我没有这样做。我的努力是

var myDataSet = []; //this is the results of what I want, ideally as a single list

for (var i = 0; i < js_datasets.length; i++) {

    if (i==0) {
        myDataSet.push(js_datasets[i]);
    }
    else {
        myDataSet.concat(js_datasets[i]);//does nothing
        myDataSet.join(js_datasets[i]);//does nothing
    }

...more logic

正如您在上面所看到的,我已尝试使用pushconcatjoin

如果我将代码更新为仅使用push(并且从不使用concat和join),那么我将获得所需的所有值,但同样,作为数组中的数组。

使用concat和join不会添加到列表中。

所以,如果我们可以假设阵列中的12个项目(如图)都包含10个项目,我想要有120个项目的单个列表!

如何简单地将此多维数组(多维数据)转换为单维数组。

1 个答案:

答案 0 :(得分:3)

这会有点复杂,因为数组 js_datasets中的项目不是数组,而是更通用的对象。这意味着如果您尝试阅读密钥,则无法假设密钥将按顺序排列

让我们写一些辅助函数来解释这个问题;

function dataItemCollectionToArray(o) {
    var keys = Object.keys(o);
    // assuming no non-DataItem keys, so next line commented out
    // keys = keys.filter(function (e) {return e.indexOf("DataItem") === 0;});
    keys.sort(function (a, b) { // ensure you will get the desired order
        return +a.slice(8) - +b.slice(8);
    });
    return keys.map(function (e) {return o[e];});
}

现在,您可以循环js_datasets执行此转化

var myDataSet = [], i;
for (i = 0; i < js_datasets.length; ++i) {
    // assuming no gaps, if you need to add gaps, also find min, max indices
    // in `dataItemCollectionToArray`, and check them in each iteration here
    myDataSet.push.apply(myDataSet, dataItemCollectionToArray(js_datasets[i]));
}

请注意,如果您希望支持旧浏览器,Object.keysArray.prototype.map可能需要进行广告拦截,即 IE&lt; = 8


更简单的解决方案可能是重写js_datasets的构造方式,以便 Objects push更多类似数组< / em>或者确实推送了真正的 Arrays ,可能还有一些额外的属性,所以你知道第一个索引的偏移量。这意味着您可以使用在互联网上找到的展平方法