Uma*_*nth 14 javascript arrays json
我有这种格式的JSON对象.
[
{
"name": "schoolname",
"line id": "0",
"time": "4-5",
"minage": "15",
"maxage": "35"
},
{
"name": "studentname1",
"line id": "1",
"class": "A"
},
{
"name": "studentname2",
"line id": "2",
"class": "B"
}
]
Run Code Online (Sandbox Code Playgroud)
我想做的事
从一组指定的标题中,从中获取并将其"line id" : "0"设置为其他项目.
例如:
headers = ["time", "minage", "maxage"]
我从中获取这些"line id" : "0"并将其交给其他人.
[
{
"name": "schoolname",
"line id": "0",
"time": "4-5",
"minage": "15",
"maxage": "35"
},
{
"name": "studentname1",
"line id": "1",
"class": "A",
"time": "4-5",
"minage": "15",
"maxage": "35"
},
{
"name": "studentname2",
"line id": "2",
"class": "B",
"time": "4-5",
"minage": "15",
"maxage": "35"
}
]
Run Code Online (Sandbox Code Playgroud)
然后删除元素"line id" : "0",如下所示:
[
{
"name": "studentname1",
"line id": "1",
"class": "A",
"time": "4-5",
"minage": "15",
"maxage": "35"
},
{
"name": "studentname2",
"line id": "2",
"class": "B",
"time": "4-5",
"minage": "15",
"maxage": "35"
}
]
Run Code Online (Sandbox Code Playgroud)
据说第一个元素是a "line id" : "0".
我尝试过的:
var headers = ["time", "minage", "maxage"]
var data =
[
{
"name": "schoolname",
"line id": "0",
"time": "4-5",
"minage": "15",
"maxage": "35"
},
{
"name": "studentname1",
"line id": "1",
"class": "A"
},
{
"name": "studentname2",
"line id": "2",
"class": "B"
}
];
for(var i = 1; i < data.length; i++)//iterate over the data leaving the 1st line
{
for(var j = 0; j < headers.length; j++)//add each header to the data lines
{
data[i][headers[j]] = data[0][headers[j]];
}
}
data.splice(0,1);
Run Code Online (Sandbox Code Playgroud)
一切正常,按预期工作.有没有办法减少这种时间复杂性并使其更有效率.
现在这具有O(n*m)的时间复杂度.
有没有办法将这些少数对象添加到所有元素?由于要为所有条目添加的键值对保持不变.
您可以使用Object.defineProperties之类的
var arr = [{
"name": "schoolname",
"line id": "0",
"time": "4-5",
"minage": "15",
"maxage": "35"
}, {
"name": "studentname1",
"line id": "1",
"class": "A"
}, {
"name": "studentname2",
"line id": "2",
"class": "B"
}],
headers = ["time", "minage", "maxage"];
function addHeaders(arr, headers) {
var header = arr.splice(0, 1)[0],
propObj = headers.reduce(function(acc, el) {
acc[el] = {
value: header[el],
writable: true,
enumerable: true
};
return acc;
}, {});
for (var i = 0, len = arr.length; i < len; i++) {
Object.defineProperties(arr[i], propObj);
}
return arr;
}
document.getElementById('r').innerHTML = 'initial: ' + JSON.stringify(arr,null,2) + '<br/>';
document.getElementById('r').innerHTML += 'result: ' + JSON.stringify(addHeaders(arr, headers),null,2);Run Code Online (Sandbox Code Playgroud)
<pre id="r"></pre>Run Code Online (Sandbox Code Playgroud)
您修复了这种数据格式吗?你应该考虑做更像的事情
school
-> info (name, etc.)
-> [classes]
-> info
-> [student_ids]
-> [students]
-> info (id)
Run Code Online (Sandbox Code Playgroud)
如果您无法更改格式.你可以用Underscore.js#default做你想要的事情.假设line_id=0总是data[0]:
var keys = ['minage','maxage','time'];
var temp = _.pick(data.shift(),keys);
data.forEach(function(e, i, a) {
a[i] = _.default(e,temp);
});
Run Code Online (Sandbox Code Playgroud)
它并没有真正降低您的复杂性,因为您基本上看起来是一个大小为N的数组,并且更新属性计数为M,这意味着您将具有O(N*M)的复杂度.如果您想要不那么复杂的东西,请不要移动/复制数据.以当前形式重复使用它.
| 归档时间: |
|
| 查看次数: |
436 次 |
| 最近记录: |