如果这是.NET,我会问如何将List<List<MyClass>
转换为List<MyClass>
。但是,我对javascript不是很了解,并且不知道如何使用Javascript术语来问这个问题!
我的javascript对象来自
创建为:
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
正如您在上面所看到的,我已尝试使用push
,concat
和join
。
如果我将代码更新为仅使用push(并且从不使用concat和join),那么我将获得所需的所有值,但同样,作为数组中的数组。
使用concat和join不会添加到列表中。
所以,如果我们可以假设阵列中的12个项目(如图)都包含10个项目,我想要有120个项目的单个列表!
如何简单地将此多维数组(多维数据)转换为单维数组。
答案 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.keys
和Array.prototype.map
可能需要进行广告拦截,即 IE&lt; = 8
更简单的解决方案可能是重写js_datasets
的构造方式,以便 Objects 你push
更多类似数组< / em>或者确实推送了真正的 Arrays ,可能还有一些额外的属性,所以你知道第一个索引的偏移量。这意味着您可以使用在互联网上找到的展平方法