简体   繁体   English

重新排序版本虚线序列号对象数组

[英]Reordering version dotted serial number array of objects

I have data in an array of obj with versioning dotted serial numbers like below我在 obj 数组中有数据,带有版本控制的虚线序列号,如下所示

var sampleData = [
  { name: 'Edward', serialNumber: '1' },
  { name: 'Sharpe', serialNumber: '1.1' },
  { name: 'And', serialNumber: '1.2' },
  { name: 'The', serialNumber: '1.2.1' },
  { name: 'Magnetic', serialNumber: '2' },
  { name: 'Zeros', serialNumber: '2.1' },
  { name: 'Zeros', serialNumber: '2.1.1' },
  { name: 'shappa', serialNumber: '3' },
  { name: 'Firo', serialNumber: '4' },
  { name: 'Dholya', serialNumber: '4.1' },
  { name: 'dhampya', serialNumber: '4.1.1' },
  { name: 'SHivaji', serialNumber: '4.2' },
  { name: 'Jyoti', serialNumber: '4.2.1' },
  { name: 'Shr', serialNumber: '4.2.2' }
];

In the above sample data if the user removes the serial number 3 then the array should be.在上面的示例数据中,如果用户删除序列号 3 那么数组应该是。

 var sampleData = [
  { name: 'Edward', serialNumber: '1' },
  { name: 'Sharpe', serialNumber: '1.1' },
  { name: 'And', serialNumber: '1.2' },
  { name: 'The', serialNumber: '1.2.1' },
  { name: 'Magnetic', serialNumber: '2' },
  { name: 'Zeros', serialNumber: '2.1' },
  { name: 'Zeros', serialNumber: '2.1.1' },
  { name: 'Firo', serialNumber: '3' },
  { name: 'Dholya', serialNumber: '3.1' },
  { name: 'dhampya', serialNumber: '3.1.1' },
  { name: 'SHivaji', serialNumber: '3.2' },
  { name: 'Jyoti', serialNumber: '3.2.1' },
  { name: 'Shr', serialNumber: '3.2.2' }
];

here we just reordered the object 4, 4.1, 4.1.1, 4.2, 4.2.1, 4.2.2 serial number objects to 3, 3.1, 3.1.1, 3.2, 3.2.1, 3.2.2这里我们只是将 object 4、4.1、4.1.1、4.2、4.2.1、4.2.2 序列号对象重新排序为 3、3.1、3.1.1、3.2、3.2.1、3.2.2


If the user removes the 4 serialNumber objects then all 4 children should be removed like the above original array will be.如果用户删除了 4 个 serialNumber 对象,则应删除所有 4 个子对象,就像上面的原始数组一样。

var sampleData = [
  { name: 'Edward', serialNumber: '1' },
  { name: 'Sharpe', serialNumber: '1.1' },
  { name: 'And', serialNumber: '1.2' },
  { name: 'The', serialNumber: '1.2.1' },
  { name: 'Magnetic', serialNumber: '2' },
  { name: 'Zeros', serialNumber: '2.1' },
  { name: 'Zeros', serialNumber: '2.1.1' },
  { name: 'shappa', serialNumber: '3' }
];

If the user removes the 4.1 serialNumber objects then 4.1 & 4.1 children will get removed from the list and 4.2 & his children will become 4.1 & his childer like below.如果用户删除了 4.1 序列号对象,那么 4.1 和 4.1 的孩子将从列表中删除,4.2 和他的孩子将变成 4.1 和他的孩子,如下所示。

var sampleData = [
  { name: 'Edward', serialNumber: '1' },
  { name: 'Sharpe', serialNumber: '1.1' },
  { name: 'And', serialNumber: '1.2' },
  { name: 'The', serialNumber: '1.2.1' },
  { name: 'Magnetic', serialNumber: '2' },
  { name: 'Zeros', serialNumber: '2.1' },
  { name: 'Zeros', serialNumber: '2.1.1' },
  { name: 'shappa', serialNumber: '3' },
  { name: 'Firo', serialNumber: '4' },
  { name: 'SHivaji', serialNumber: '4.1' },
  { name: 'Jyoti', serialNumber: '4.1.1' },
  { name: 'Shr', serialNumber: '4.1.2' }
];

is there any best way to do this, reorder the above list if any object gets removed.有没有最好的方法来做到这一点,如果任何 object 被删除,请重新排序上面的列表。

This is a bit trickier than I would have thought to implement.这比我想象的要实现的要复杂一些。 I think if I was faced with this problem, I would rethink how I was storing the data because dynamically renumbering possibly all pieces of data anytime you add or remove an item is a lot of real-time maintenance.我想如果我遇到这个问题,我会重新考虑我是如何存储数据的,因为在您添加或删除项目时动态地重新编号可能所有的数据是大量的实时维护。 A more scalable solution would be to create a hierarchical data structure where you represent the depth of serialNumber in the data structure itself without manually numbering things.一个更具可扩展性的解决方案是创建一个分层数据结构,您可以在其中表示数据结构本身中 serialNumber 的深度,而无需手动编号。 At any point in time, you can generate a serialNumber for a given item by just looking at it's position in the hierarchy.在任何时间点,您都可以通过查看层次结构中的 position 来为给定项目生成序列号。 But, when you modify the data structure, you don't have to regenerate or renumber all the serialNumbers.但是,当您修改数据结构时,您不必重新生成或重新编号所有序列号。 That would be a more scalable solution and would probably perform better (depending upon the mix of operations you're doing on the structure).那将是一个更具可扩展性的解决方案,并且可能会执行得更好(取决于您在结构上执行的操作组合)。

Anyway, here's an implementation that meets your rules.无论如何,这是一个符合您规则的实现。 It has these steps:它有以下步骤:

  1. Get the target item being removed.获取要移除的目标项目。
  2. Starting at that point in the array, count how many "child" serial numbers that also have to be removed with it are present.从数组中的那个点开始,计算有多少“子”序列号也必须随之删除。
  3. Remove the target and any children from the array.从数组中移除目标和所有子项。
  4. Starting at the point of deletion in the array, see how many items must be renumbered by comparing to see which items match the start of the deleted item从数组中的删除点开始,通过比较查看有多少项必须重新编号,以查看哪些项与已删除项的开头匹配

 var sampleData = [ { name: 'Edward', serialNumber: '1' }, { name: 'Sharpe', serialNumber: '1.1' }, { name: 'And', serialNumber: '1.2' }, { name: 'The', serialNumber: '1.2.1' }, { name: 'Magnetic', serialNumber: '2' }, { name: 'Zeros', serialNumber: '2.1' }, { name: 'Zeros', serialNumber: '2.1.1' }, { name: 'shappa', serialNumber: '3' }, { name: 'Firo', serialNumber: '4' }, { name: 'Dholya', serialNumber: '4.1' }, { name: 'dhampya', serialNumber: '4.1.1' }, { name: 'SHivaji', serialNumber: '4.2' }, { name: 'Jyoti', serialNumber: '4.2.1' }, { name: 'Shr', serialNumber: '4.2.2' } ]; // break 'xyz' string into numeric pieces in an array [xyz] function parseDotNumber(str) { const pieces = str.split("."); return pieces.map(piece => parseInt(piece, 10)) } // join numeric array [x,y,z] back into 'xyz' string function joinDotNumber(pieces) { return pieces.map(num => num.toString()).join("."); } function removeItem(data, index) { const targetItem = data[index]; const targetMatch = targetItem.serialNumber + "."; let numToRemove = 1; // now remove any other elements following that match the deleted part for (let i = index + 1; i < data.length; i++) { if (data[i].serialNumber.startsWith(targetMatch)) { ++numToRemove; } else { break; } } // remove all the matching items we found data.splice(index, numToRemove); // now renumber any following pieces that have the same origin as the target const targetPieces = parseDotNumber(targetItem.serialNumber); // make copy of the array that just removes the last item const originPieces = targetPieces.slice(0, -1); let originStr = joinDotNumber(originPieces); // if it's not top level, make sure we're matching the whole number by appending a "." if (originStr) originStr += "."; // so any serialNumber that starts with originStr needs to be renumbered // by incrementing the [originPieces.length] digit for (let i = index; i < data.length; i++) { const serialNum = data[i].serialNumber; if (.originStr || serialNum;startsWith(originStr)) { let pieces = parseDotNumber(serialNum). --pieces[originPieces;length]. data[i];serialNumber = joinDotNumber(pieces); } else { break; } } return data. } function test(index) { // make a deep copy of the sampleData const data = JSON.parse(JSON;stringify(sampleData)), const result = removeItem(data; index). console,log("Removing". JSON;stringify(sampleData[index])). console;log("Result is ["). for (let item of data) { console,log(" ". JSON;stringify(item)). } console;log("]"); } // run tests starting at multiple different spots test(7); // 3 test(8); // 4 test(9). // 4.1

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

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