我有一个这种格式的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"
}
]
我想做什么
从一组指定的标题中,从"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"
}
]
然后使用"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"
}
]
据说第一个元素是"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);
每件事都很好,一切都按预期进行。有没有办法减少时间复杂性并使之更有效率。
现在它的时间复杂度为O(n * m)。
有没有办法将这几个对象添加到所有元素中?作为要为所有条目添加的键值对,所有条目保持不变。
发布于 2015-07-07 04:10:24
您可以像这样使用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);
<pre id="r"></pre>
发布于 2015-07-04 07:13:30
这是你固定的数据格式吗?你应该考虑做些更像
school
-> info (name, etc.)
-> [classes]
-> info
-> [student_ids]
-> [students]
-> info (id)
如果你不能改变你的格式。你可以用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);
});
它并不能真正降低您的复杂性,因为您基本上是在查看一个大小为N的数组,并且更新属性计数为M,这意味着您的复杂性为O(N*M)。如果你想要一些不那么复杂的东西,不要移动/复制数据。在当前形式中重用它。
发布于 2015-07-04 07:14:03
因为您说要从第0元素复制相同的值,所以可以将其存储在变量(例如new_data
)中,然后遍历data
数组并将它们添加到那里。
这就像迭代data
和插入密钥-val对一样复杂。
就像这样-
> new_data = {}
//Getting all the content with header keys in data into new_data
> headers.forEach(function(v){new_data[v] = data[0][v]})
//Storing the new_data
> new_data
Object {time: "4-5", minage: "15", maxage: "35"}
//Adding the new_data into data
> data.forEach(function(d_val){
for(k_nd in new_data){
d_val[k_nd] = new_data[k_nd];
}
});
//Removing the 0th array element
> data.splice(0, 1)
//Checking it
> JSON.stringify(data[0])
"{"name":"studentname1","line id":"1","class":"A","time":"4-5","minage":"15","maxage":"35"}"
https://stackoverflow.com/questions/31217808
复制相似问题