首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将对象属性添加到JSON对象中

将对象属性添加到JSON对象中
EN

Stack Overflow用户
提问于 2015-07-04 06:49:38
回答 5查看 1.8K关注 0票数 14

我有一个这种格式的JSON对象。

代码语言:javascript
运行
复制
[
    {
        "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"那里得到这些,然后像这样送给其他人。

代码语言:javascript
运行
复制
[
    {
        "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"删除元素,如下所示:

代码语言:javascript
运行
复制
[
    {
        "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"

我尝试过的:

代码语言:javascript
运行
复制
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)。

有没有办法将这几个对象添加到所有元素中?作为要为所有条目添加的键值对,所有条目保持不变。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-07-07 04:10:24

您可以像这样使用Object.defineProperties

代码语言:javascript
运行
复制
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);
代码语言:javascript
运行
复制
<pre id="r"></pre>

票数 9
EN

Stack Overflow用户

发布于 2015-07-04 07:13:30

这是你固定的数据格式吗?你应该考虑做些更像

代码语言:javascript
运行
复制
school
    -> info (name, etc.)
    -> [classes]
       -> info
       -> [student_ids]
    -> [students]
       -> info (id)

如果你不能改变你的格式。你可以用Underscore.js#default做你想做的事情。假设line_id=0总是data[0]

代码语言:javascript
运行
复制
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)。如果你想要一些不那么复杂的东西,不要移动/复制数据。在当前形式中重用它。

票数 7
EN

Stack Overflow用户

发布于 2015-07-04 07:14:03

因为您说要从第0元素复制相同的值,所以可以将其存储在变量(例如new_data)中,然后遍历data数组并将它们添加到那里。

这就像迭代data和插入密钥-val对一样复杂。

就像这样-

代码语言:javascript
运行
复制
> 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"}"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31217808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档