我有一个对象数组,要使用依赖于序列的新值进行更新。
所以这个:
[
{ "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"
。第二组将是一个“偶数”组,因此标记为“偶数” 。
答案 0 :(得分:5)
它并不经常使用,但是map
和forEach
之类的函数需要一个可选的最终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)
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)