带携带功能的可变阵列?

时间:2019-07-02 05:15:27

标签: javascript arrays

我有一个对象数组,要使用依赖于序列的新值进行更新。

所以这个:

[
  { "init": 3, "data": "..." },
  { "init": 3, "data": "..." },
  { "init": 3, "data": "..." },
  { "init": 5, "data": "..." },
  { "init": 6, "data": "..." },
  { "init": 6, "data": "..." },
  { "init": 7, "data": "..." },
  { "init": 8, "data": "..." }
  }
]

..变成这样:

[
  { "init": 3, "group": "odd",  "data": "..." },
  { "init": 3, "group": "odd",  "data": "..." },
  { "init": 3, "group": "odd",  "data": "..." },
  { "init": 5, "group": "even", "data": "..." },
  { "init": 6, "group": "odd",  "data": "..." },
  { "init": 6, "group": "odd",  "data": "..." },
  { "init": 6, "group": "odd",  "data": "..." },
  { "init": 7, "group": "even", "data": "..." },
  { "init": 8, "group": "odd",  "data": "..." }
  }
]

也就是说,在每个项目中插入一个“ group”元素,根据其是在“ init”值的偶数组还是偶数组中。

数组始终按“初始”值升序排列。

NB。 "odd""even"不是由"init"值的奇/均匀度确定的,而是的奇/均匀度确定的初始值属于。在此示例中,初始值的 first 组为“ 3”,因此所有带有"init":"3"的项目都标记为"odd"。第二组将是一个“偶数”组,因此标记为“偶数”

3 个答案:

答案 0 :(得分:5)

它并不经常使用,但是mapforEach之类的函数需要一个可选的最终argumnet用作回调中的this。您可以在循环过程中利用这一点来维持状态。

例如:

let a = [
    { "init": 3 },
    { "init": 3 },
    { "init": 3 },
    { "init": 5 },
    { "init": 6 },
    { "init": 6 },
    { "init": 7 },
    { "init": 8 }
  ]

let res = a.map(function({init}) {
    if (this.last !== init) this.even = !this.even
    this.last = init
    return {init, group:this.even ? "even": "odd" }
}, {last: undefined, even:true} )

console.log(res)

请注意:由于它取决于this,因此不能使用箭头函数进行回调。

答案 1 :(得分:2)

您需要的只是一个for循环:

  let prev, odd =  false;
   for(const el of data) {
     if(prev !== el.init) odd = !odd;
     el.group = odd ? "odd" : "even";
     prev = el.init;
   }

答案 2 :(得分:1)

您可以使用Set确定组索引,然后使用.map()创建输出:

let array = [
  { "init": 3, "data": "..." },
  { "init": 3, "data": "..." },
  { "init": 3, "data": "..." },
  { "init": 5, "data": "..." },
  { "init": 6, "data": "..." },
  { "init": 6, "data": "..." },
  { "init": 6, "data": "..." },
  { "init": 7, "data": "..." },
  { "init": 8, "data": "..." }
]

let groups = Array.from(new Set(array.map(x => x.init)));

let oddOrEven = index => (index % 2 !== 0 ? "even": "odd" );

let result = array.map(({init, ...rest}) => ({
    init: init,
    ...rest,
    group: oddOrEven(groups.findIndex(x => x === init))
}))

console.log(result)