在javascript中通过键连接多个对象

在javascript中通过键连接多个对象,javascript,Javascript,假设我有一个这样的对象数组: data = [ { set: "a", values: [ {time: 1, value: 10}, {time: 2, value: 13}, {time: 3, value: 12} ] }, { set: "b", values: [ {time: 1, va

假设我有一个这样的对象数组:

data = [
    {
        set: "a",
        values: [
            {time: 1, value: 10},
            {time: 2, value: 13},
            {time: 3, value: 12}
        ]
    },
    {
        set: "b",
        values: [
            {time: 1, value: 22},
            {time: 2, value: 24},
            {time: 3, value: 27}
        ]
    },
    {
        set: "c",
        values: [
            {time: 1, value: 34},
            {time: 2, value: 38},
            {time: 3, value: 18}
        ]
    },
    {
        set: "d",
        values: [
            {time: 1, value: 24},
            {time: 2, value: 19},
            {time: 3, value: 22}
        ]
    }
]
data = [
    {time: 1, set_a: 10, set_b: 22, set_c: 34, set_d: 24},
    {time: 2, set_a: 13, set_b: 24, set_c: 38, set_d: 19},
    {time: 3, set_a: 12, set_b: 27, set_c: 18, set_d: 22}
]
我想按时间连接对象,如下所示:

data = [
    {
        set: "a",
        values: [
            {time: 1, value: 10},
            {time: 2, value: 13},
            {time: 3, value: 12}
        ]
    },
    {
        set: "b",
        values: [
            {time: 1, value: 22},
            {time: 2, value: 24},
            {time: 3, value: 27}
        ]
    },
    {
        set: "c",
        values: [
            {time: 1, value: 34},
            {time: 2, value: 38},
            {time: 3, value: 18}
        ]
    },
    {
        set: "d",
        values: [
            {time: 1, value: 24},
            {time: 2, value: 19},
            {time: 3, value: 22}
        ]
    }
]
data = [
    {time: 1, set_a: 10, set_b: 22, set_c: 34, set_d: 24},
    {time: 2, set_a: 13, set_b: 24, set_c: 38, set_d: 19},
    {time: 3, set_a: 12, set_b: 27, set_c: 18, set_d: 22}
]

我可以这样做的方法是,输入唯一的时间键,然后循环遍历每个集合,并创建一个具有thsoe值的新对象。但这是最有效的方法吗?或者有没有类似的函数?

您可以使用类似的函数

例如:

// data = { ... }

var result = data.map(function (item) {
  var tmp = {};
  for (var i in item.values) {
    tmp[item.values[i].time] = { ['set_' + item.set]: item.values[i].value };
  }
  return tmp;
}).reduce(function (a, b) {
  for (i in a) {
    Object.assign(a[i], b[i])
  }
  return a;
});
此处讨论了该方法的效率:


这是一个遍历问题,要输出结果,必须遍历每个项目。然而,这些集合是相互独立的,不能仅仅从先前的计算中推断出后一个集合值。解决方案不可能是 优化而不遍历树。这里是一个简单的O(m*n)时间解,其中m是次数,n是集合数(a,b,c…)

const数据=[
{
集:“a”,
价值观:[
{时间:1,值:10},
{时间:2,值:13},
{时间:3,值:12}
]
},
{
布景:“b”,
价值观:[
{时间:1,值:22},
{时间:2,值:24},
{时间:3,值:27}
]
},
{
集:“c”,
价值观:[
{时间:1,值:34},
{时间:2,值:38},
{时间:3,值:18}
]
},
{
布景:“d”,
价值观:[
{时间:1,值:24},
{时间:2,值:19},
{时间:3,值:22}
]
}
];
函数processData(数据){
if(data.length==0 | | data[0].values.length==0)
返回[];
常量结果=[];
常量时间=数据[0]。value.length;
对于(变量i=0;i<次;i++){
常量项={};
item.time=数据[0]。值[i]。时间;
data.forEach(x=>item[“set_”+x.set]=x.values[i].value);
结果:推送(项目);
}
返回结果;
}

console.log(processData(data))您应该先尝试…然后在遇到问题时询问。这不是一个“如何”教程网站或免费的代码编写服务。这里的目标是在代码无法按预期执行时帮助您处理代码。听起来你对如何开始有一个很好的想法…然后就迫不及待地问了us@charlietfl我不同意——OP提供了一种抽象的方法,并询问是否有更有效的方法来解决所述问题。代码并不总是必需的。@le_m不同意你想要的一切,但OP的标准是至少要展示尝试和/或研究成果,如中所述。我很确定你必须卷起袖子,环住你的对象:)这样或那样:(“我可以这样做的方法是,输入唯一的时间键,然后在每个集合中循环,并创建一个具有thsoe值的新对象。但这是最有效的方法吗?”你说的“高效”是什么意思?没有进一步明确“高效”的定义,是的。因为没有代码或代码的基准出现在需要比较的问题中。