【问题标题】:create new array of objects from existing array [duplicate]从现有数组创建新的对象数组[重复]
【发布时间】:2017-08-26 03:51:39
【问题描述】:

我有一个想要在 JS 中重新格式化的现有数组。这是现有的数组,其中每个项目都是一个对象:

[
 {
  end_time:"7.14",
  pk:45065,
  start_time:"4.51",
  text:"Lorem Ipsum"
 },
 {
  end_time:"9.00",
  pk:45066,
  start_time:"7.14",
  text:"Lorem Ipsum Something"
 },
 {
  end_time:"13.09",
  pk:450667 ,     
  start_time:"9.00",
  text:"Lorem Ipsum Something"
 }, 
 {
  end_time:"17.01",
  pk:45068,
  start_time:"13.09",
  text:"Lorem Ipsum"
 },
 {
  end_time:"25.10",
  pk:45069,
  start_time:"17.01",
  text:"Lorem Ipsum Something"
 },
 {
  end_time:"28.06",
  pk:450670 ,     
  start_time:"25.10",
  text:"Lorem Ipsum Something"
 },
]

我想创建一个新的对象数组,其中旧数组中的每三个对象成为新数组中的一个对象,如下所示:

 [
  segment: {
    phrase: {
      end_time:"7.14",
      pk:45065,
      start_time:"4.51",
      text:"Lorem Ipsum"
    },
    phrase: {
      end_time:"9.00",
      pk:45066,
      start_time:"7.14",
      text:"Lorem Ipsum Something"
     },
     phrase: {
      end_time:"13.09",
      pk:450667 ,     
      start_time:"9.00",
      text:"Lorem Ipsum Something"
     }
  },
  segment {
    phrase: {
      end_time:"17.01",
      pk:45068,
      start_time:"13.09",
      text:"Lorem Ipsum"
    },
    phrase: {
      end_time:"25.10",
      pk:45069,
      start_time:"17.01",
      text:"Lorem Ipsum Something"
    },
    phrase: {
      end_time:"28.06",
      pk:450670 ,     
      start_time:"25.10",
      text:"Lorem Ipsum Something"
    },
  }
]

我最苦恼的是如何每三个项目拉出并推送到我猜的地图或循环内的新段对象。我不确定解决此问题的最有效方法。非常感谢任何帮助。

【问题讨论】:

  • arr.length % 3 !== 0的边缘情况下会发生什么
  • 相位、相位、相位...相同的键?
  • 你不能对许多对象属性使用相同的键,所以这不起作用。
  • 你需要让pk独一无二
  • 对于它的价值,你没有向我们展示任何 JSON。 JSON 是一种文本格式,需要将键括在双引号中。您向我们展示了一组对象。

标签: javascript arrays multidimensional-array


【解决方案1】:
  1. 您想要的结果应该是对象,因为数组没有字符串键。
  2. 对象应具有唯一键,因此建议的解决方案将数字后缀附加到“段”和“短语”键。
  3. 代码:

var arr = [
  {
    end_time:"7.14",
    pk:45065,
    start_time:"4.51",
    text:"Lorem Ipsum"
  },
  {
    end_time:"9.00",
    pk:45066,
    start_time:"7.14",
    text:"Lorem Ipsum Something"
  },
  {
    end_time:"13.09",
    pk:450667 ,     
    start_time:"9.00",
    text:"Lorem Ipsum Something"
  }, 
  {
    end_time:"17.01",
    pk:45068,
    start_time:"13.09",
    text:"Lorem Ipsum"
  },
  {
    end_time:"25.10",
    pk:45069,
    start_time:"17.01",
    text:"Lorem Ipsum Something"
  },
  {
    end_time:"28.06",
    pk:450670 ,     
    start_time:"25.10",
    text:"Lorem Ipsum Something"
  },
];
var obj = {};
arr.forEach(arrayTransformClosure(obj));
document.getElementById('output').innerHTML = JSON.stringify(obj, null, 2);
// Functions
function arrayTransformClosure(obj) {
  var phrase = 0;
  var segment = 1;
  return function (elem) {
    ++phrase;
    if (phrase == 1) {
      obj['segment_' + segment] = {
        ['phrase_' + phrase]: elem
      };
    } else if (phrase <= 3) {
      obj['segment_' + segment]['phrase_' + phrase] = elem;
    } else {
      phrase = 1;
      ++segment;
      obj['segment_' + segment] = {
        ['phrase_' + phrase]: elem
      };
    }
  };
}
&lt;pre id="output"&gt;&lt;/pre&gt;

【讨论】:

    【解决方案2】:

    Reduce 函数将每个对象从json 数组中删除到一个新对象中,其中key短语,它的值是那个指定的对象。然后,只需将结果分配给一个新创建的对象作为 segment 键的值。

    var json = [{end_time:"7.14",pk:45065,start_time:"4.51",text:"Lorem Ipsum"},{end_time:"9.00",pk:45066,start_time:"7.14",text:"Lorem Ipsum Something"},{end_time:"13.09",pk:450667,start_time:"9.00",text:"Lorem Ipsum Something"},{end_time:"17.01",pk:45068,start_time:"13.09",text:"Lorem Ipsum"},{end_time:"25.10",pk:45069,start_time:"17.01",text:"Lorem Ipsum Something"},{end_time:"28.06",pk:450670,start_time:"25.10",text:"Lorem Ipsum Something"}], 
      res = json.reduce(function(s,a){
        obj = {};
        obj.phrase = a;
        s.push(obj);
        return s;
      }, []);
      
      var object = {};
      object.segment = res;
      var result = [object];
      
      console.log(result);

    【讨论】:

    • 您能解释一下您的代码在做什么以及它如何解决问题吗?
    猜你喜欢
    • 2021-03-09
    • 2019-02-28
    • 2014-01-30
    • 1970-01-01
    • 2022-07-20
    • 2018-12-19
    • 2022-01-08
    • 1970-01-01
    • 2017-05-07
    相关资源
    最近更新 更多