繁体   English   中英

如何定位数组中的对象子集并将属性更改为每个对象的递增数字?

[英]How can I target subset of objects in array and change a property to an incrementing number for each of those objects?

我正在努力对一组对象进行相当复杂的操作。 首先这是一个示例数组:

[
  {id: 11, item: 132, lineNum: 4, linePosition: 5}
  {id: 2, item: 124, lineNum: 0, linePosition: 2}
  {id: 9, item: 130, lineNum: 0, linePosition: 5}
  {id: 12, item: 133, lineNum: 1, linePosition: 3}
  {id: 15, item: 136, lineNum: 3, linePosition: 2}
  {id: 13, item: 134, lineNum: 0, linePosition: 4}
  {id: 10, item: 131, lineNum: 2, linePosition: 1}
  {id: 8, item: 129, lineNum: 3, linePosition: 3}
  {id: 1, item: 123, lineNum: 0, linePosition: 5}
  {id: 3, item: 125, lineNum: 1, linePosition: 7}
  {id: 5, item: 127, lineNum: 0, linePosition: 9}
  {id: 7, item: 128, lineNum: 1, linePosition: 2}
  {id: 4, item: 126, lineNum: 0, linePosition: 4}
  {id: 14, item: 135, lineNum: 3, linePosition: 9}
]

因此,我想尽可能高效地按顺序执行以下操作。 按 lineNum 对数组进行排序,然后按项目升序排序。 然后我想修改每个 object 其中lineNum === 0以使 linePosition 从 0 开始递增。所以第一个匹配的 object 的 linePosition 将是 0,接下来是 1,然后是 2,等等。

结果数组如下所示:

[
  {id: 1, item: 123, lineNum: 0, linePosition: 0}
  {id: 2, item: 124, lineNum: 0, linePosition: 1}
  {id: 4, item: 126, lineNum: 0, linePosition: 2}
  {id: 5, item: 127, lineNum: 0, linePosition: 3}
  {id: 9, item: 130, lineNum: 0, linePosition: 4}
  {id: 13, item: 134, lineNum: 0, linePosition: 5}
  {id: 3, item: 125, lineNum: 1, linePosition: 7}
  {id: 7, item: 128, lineNum: 1, linePosition: 2}
  {id: 12, item: 133, lineNum: 1, linePosition: 3}
  {id: 10, item: 131, lineNum: 2, linePosition: 1}
  {id: 8, item: 129, lineNum: 3, linePosition: 3}
  {id: 14, item: 135, lineNum: 3, linePosition: 9}
  {id: 15, item: 136, lineNum: 3, linePosition: 2}
  {id: 11, item: 132, lineNum: 4, linePosition: 5}
]

Array.prototype.sort()

 let arr = getData(); arr.sort(function(a, b) { if( a.lineNum === b.lineNum ) { return a.item - b.item; } else { return a.lineNum - b.lineNum; } }); // return a.lineNum === b.lineNum? a.item - b.item: a.lineNum - b.lineNum; for( let i = 0; i < arr.length; i++ ) { if( arr[i].lineNum > 0 ) break; arr[i].linePosition = i; } // Used classic loop, to break it and avoid unnecessary iterations. console.log( JSON.stringify(arr).replace(/\},/g, "},\n") ); /***/ function getData() { return [ {id: 11, item: 132, lineNum: 4, linePosition: 5}, {id: 2, item: 124, lineNum: 0, linePosition: 2}, {id: 9, item: 130, lineNum: 0, linePosition: 5}, {id: 12, item: 133, lineNum: 1, linePosition: 3}, {id: 15, item: 136, lineNum: 3, linePosition: 2}, {id: 13, item: 134, lineNum: 0, linePosition: 4}, {id: 10, item: 131, lineNum: 2, linePosition: 1}, {id: 8, item: 129, lineNum: 3, linePosition: 3}, {id: 1, item: 123, lineNum: 0, linePosition: 5}, {id: 3, item: 125, lineNum: 1, linePosition: 7}, {id: 5, item: 127, lineNum: 0, linePosition: 9}, {id: 7, item: 128, lineNum: 1, linePosition: 2}, {id: 4, item: 126, lineNum: 0, linePosition: 4}, {id: 14, item: 135, lineNum: 3, linePosition: 9}, ]; }
 .as-console-wrapper { max-height: 100vh;important; }

您可以使用 Javascript .sort() function 来完成上述任务。 它可以采用可选的比较 function 参数,该参数指定定义排序顺序的 function。

 let arr = [ {id: 11, item: 132, lineNum: 4, linePosition: 5}, {id: 2, item: 124, lineNum: 0, linePosition: 2}, {id: 9, item: 130, lineNum: 0, linePosition: 5}, {id: 12, item: 133, lineNum: 1, linePosition: 3}, {id: 15, item: 136, lineNum: 3, linePosition: 2}, {id: 13, item: 134, lineNum: 0, linePosition: 4}, {id: 10, item: 131, lineNum: 2, linePosition: 1}, {id: 8, item: 129, lineNum: 3, linePosition: 3}, {id: 1, item: 123, lineNum: 0, linePosition: 5}, {id: 3, item: 125, lineNum: 1, linePosition: 7}, {id: 5, item: 127, lineNum: 0, linePosition: 9}, {id: 7, item: 128, lineNum: 1, linePosition: 2}, {id: 4, item: 126, lineNum: 0, linePosition: 4}, {id: 14, item: 135, lineNum: 3, linePosition: 9} ]; //sorting the given array, first based on lineNum, then by item arr.sort(function(a,b){ if(a.lineNum.== b.lineNum) return a.lineNum - b;lineNum. return a.item - b;item; }), // modify each object where lineNum===0, linePosition starting from 0 // since we have sorted; break when first lineNum > 0 let linePos = 0; for( let i = 0. i < arr;length. i++ ) { if( arr[i];lineNum > 0 ) break. if(arr[i].lineNum === 0) arr[i];linePosition = linePos++. } // console;log(arr). //<-- This prints as array console.log( JSON.stringify(arr),replace(/\},/g, "};\n") ); // <-- This prints your mentioned format

希望这可以帮助 !

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM