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

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)的时间复杂度.

有没有办法将这些少数对象添加到所有元素?由于要为所有条目添加的键值对保持不变.

Gru*_*ndy 9

您可以使用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)


Chr*_*SFT 7

您修复了这种数据格式吗?你应该考虑做更像的事情

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)的复杂度.如果您想要不那么复杂的东西,请不要移动/复制数据.以当前形式重复使用它.