【问题标题】:Joining multiple objects by a key in javascript通过javascript中的键连接多个对象
【发布时间】:2017-04-16 23:55:50
【问题描述】:

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

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}
]

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

【问题讨论】:

  • 您应该先尝试...然后在遇到问题时询问。这不是一个“如何” 教程网站或免费的代码编写服务。此处的目标是在您的代码未按预期执行时为您提供帮助。听起来你对如何开始有一个很好的主意......然后跳枪问我们
  • @charlietfl 我不同意 - OP 提供了一种抽象方法,并询问是否有更有效的方法来解决所述问题。并非总是需要代码。
  • @le_m 不同意所有你想要的,但规范是 OP 至少显示 help center 中所述的尝试和/或研究工作
  • 我敢肯定,你必须挽起袖子,把你的物品绕起来:)一种或另一种方式:(
  • “我可以这样做的方法是放置唯一的时间键,然后循环遍历每个集合并创建一个具有这些值的新对象。但这是最有效的方法吗吗?” “高效”是什么意思?如果没有进一步明确“有效”的定义,是的。由于要比较的问题中没有代码或代码基准。

标签: javascript


【解决方案1】:

你可以使用map reduce之类的东西。

例子:

// 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;
});

这里讨论了该方法的效率:

For Array, is it more efficient to use map() & reduce() instead of forEach() in javascript?

【讨论】:

    【解决方案2】:

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

    const 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}
            ]
        }
    ];
    
    function processData(data) {
      if (data.length === 0 || data[0].values.length === 0) 
        return [];
      const result = [];
      const times = data[0].values.length;
      for(var i = 0; i < times; i++) {
        const item = {};
        item.time = data[0].values[i].time;
        data.forEach(x => item["set_" + x.set] = x.values[i].value);
        result.push(item);
      }
      return result;
    }
    
    console.log(processData(data));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      相关资源
      最近更新 更多