Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带携带函数的变异数组?_Javascript_Arrays - Fatal编程技术网

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参数是完美的,因此更新了您的答案以被接受。