Javascript 带携带函数的变异数组?
我有一个对象数组,我想用一个依赖于序列的新值更新它 因此:Javascript 带携带函数的变异数组?,javascript,arrays,Javascript,Arrays,我有一个对象数组,我想用一个依赖于序列的新值更新它 因此: [ { "init": 3, "data": "..." }, { "init": 3, "data": "..." }, { "init": 3, "data": "..." }, { "init": 5, "data": "..." }, { "init": 6, "data": "..." }, { "init": 6, "data": "..." }, { "init": 7, "data": "..
[
{ "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”值的偶数组还是奇数组中而定
数组总是按“init”值升序排序
注意。“奇数”
或“偶数”
不是根据“init”
值的奇数/均匀度来确定的,而是init值所属组的奇数/均匀度。在本例中,init值的第一组是“3”,因此带有“init”:“3”
的所有项目都标记为“奇数”“
。第二个组是“偶数”组,因此标记为“偶数”。您可以使用它来确定组索引,然后创建输出:
let数组=[
{“init”:3,“数据”:“…”},
{“init”:3,“数据”:“…”},
{“init”:3,“数据”:“…”},
{“init”:5,“数据”:“…”},
{“init”:6,“数据”:“…”},
{“init”:6,“数据”:“…”},
{“init”:6,“数据”:“…”},
{“init”:7,“数据”:“…”},
{“init”:8,“数据”:“…”}
]
让groups=Array.from(新集合(Array.map(x=>x.init));
设oddOrEven=index=>(索引%2!==0?“偶数”:“奇数”);
让result=array.map({init,…rest})=>({
init:init,
休息
组:oddOrEven(groups.findIndex(x=>x==init))
}))
console.log(result)
它不是经常使用的,但是像map
和forEach
这样的函数在回调中使用一个可选的最终参数作为this
。您可以利用这一点在循环过程中保持状态
例如:
a=[
{“init”:3},
{“init”:3},
{“init”:3},
{“init”:5},
{“init”:6},
{“init”:6},
{“init”:7},
{“init”:8}
]
设res=a.map(函数({init}){
如果(this.last!==init)this.偶数=!this.偶数
this.last=init
返回{init,group:this.偶数?“偶数”:“奇数”}
},{last:undefined,偶数:true})
console.log(res)
您只需要一个for
循环:
let prev, odd = false;
for(const el of data) {
if(prev !== el.init) odd = !odd;
el.group = odd ? "odd" : "even";
prev = el.init;
}
是否有方法引用array.foreach函数中的前一个数组成员?也就是说,如果array.foreach当前正在处理项n,函数能否引用项n-1?
array.prototype.foreach
提供当前元素的索引。返回{init,group:this.even}
。。这是否意味着数组对象的其他元素将不会被保留?@Erics您可以返回任何内容。返回的任何内容都将添加到数组中。我删除了额外的属性,因为它们与问题无关。这是对状态管理的良好调用。我根本没想过。获得我的升级票。@MarkMeyer问题是获得更新的数组,因此这些额外属性是相关的。不过,使用state参数是完美的,因此更新了您的答案以被接受。