gpt4 book ai didi

javascript - 根据字符串中的前两个数字对字符串中的行进行重新排序

转载 作者:行者123 更新时间:2023-12-03 08:03:53 25 4
gpt4 key购买 nike

我从不相关的源获取一些字符串data,其中包含(以及其他文本)遵循类似于^INSERT INTO\w VALUES (\d, . *$。我想要做的是根据第一列(如果第二列是数字,那么第二列也是数字)的值对这些行进行排序。

到目前为止,我的代码对于第一个值有严格增量的行来说工作得很好,但是当值重复时,逻辑就会中断,并且会输出 undefined 。我还想知道如果第一个数字重复,如何根据第二个数字进行排序。

按多个属性排序本身对我来说不是问题,问题在于我的对象的设置方式(它们不允许重复的 ID,因为每个 ID 使用 1 个对象键)。

var data = 
"--\n\
-- PostgreSQL database dump\n\
--\n\
\n\
SET statement_timeout = 0;\n\
SET lock_timeout = 0;\n\
SET client_encoding = 'UTF8';\n\
SET standard_conforming_strings = on;\n\
SET check_function_bodies = false;\n\
SET client_min_messages = warning;\n\
\n\
-- Working fine\n\
INSERT INTO c VALUES (3, 'c', 45);\n\
INSERT INTO c VALUES (1, 'a', 11);\n\
INSERT INTO c VALUES (5, 'e', 77);\n\
INSERT INTO c VALUES (4, 'd', 76);\n\
INSERT INTO c VALUES (2, 'b', 33);\n\
\n\
--\n\
-- Name: a; Type: TABLE; Schema: public\n\
--\n\
CREATE TABLE a (\n\
first integer NOT NULL,\n\
second integer NOT NULL\n\
);\n\
\n\
--\n\
-- Name: a_first_second; Type: CONSTRAINT; Schema: public\n\
--\n\
ALTER TABLE ONLY a\n\
ADD CONSTRAINT a_first_second PRIMARY KEY (first, second);\n\
\n\
-- Breaks\n\
INSERT INTO a VALUES (1, 1);\n\
INSERT INTO a VALUES (2, 5);\n\
INSERT INTO a VALUES (4, 2);\n\
INSERT INTO a VALUES (5, 6);\n\
INSERT INTO a VALUES (2, 4);\n\
INSERT INTO a VALUES (3, 7);\n\
INSERT INTO a VALUES (4, 6);\n\
INSERT INTO a VALUES (2, 7);\n\
INSERT INTO a VALUES (6, 9);\n\
\n\
-- All good here\n\
INSERT INTO b VALUES (2, 'b', 'Description');\n\
INSERT INTO b VALUES (3, 'c', 'Description\n\
2nd line of description');\n\
INSERT INTO b VALUES (1, 'a', 'Description');\n\
INSERT INTO b VALUES (4, 'd', 'Description\n\
2nd line of description\n\
3rd line of description');\n\
INSERT INTO b VALUES (5, 'e', 'Description');";
/*/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/document.body.innerHTML='<code><pre></pre></code>';console = {log:function(input){document.getElementsByTagName('pre')[0].innerHTML+=input+'\n'}};
var groups = {},
test = /INSERT INTO "?([a-z]+)"?\s*VALUES\s*\((\d+),[\s\S]+?;/g;
data.replace(test,function(row,group,field){
if (typeof groups[group] !== 'object')
groups[group] = {};
groups[group][field] = row;
return row;
});
var sortedGroupKeys = {},
groupStep = {};
for (var j = 0, k = Object.keys(groups), l = k.length; j<l; j++){
var group = k[j];
sortedGroupKeys[group] = Object.keys(groups[group]).sort(function(a,b){
return parseInt(a, 10) - parseInt(b, 10);
});
groupStep[group] = 0;
}
data = data.replace(test,function(row,group){
var nextSortedKeyIndex = groupStep[group]++,
nextSortedKey = sortedGroupKeys[group][nextSortedKeyIndex];

return groups[group][nextSortedKey];
});
console.log(data);

最佳答案

这里的基本轮廓是:

  • 拆分并迭代表插入 block
    • 拆分为“插入命令行”
    • 对行进行排序
    • 加入行
  • 加入区 block

var data = 
"-- Working fine\n\
INSERT INTO c VALUES (3, 'c', 45);\n\
INSERT INTO c VALUES (1, 'a', 11);\n\
INSERT INTO c VALUES (5, 'e', 77);\n\
INSERT INTO c VALUES (4, 'd', 76);\n\
INSERT INTO c VALUES (2, 'b', 33);\n\
\n\
-- Breaks (but not really broken anymore)\n\
INSERT INTO a VALUES (1, 1);\n\
INSERT INTO a VALUES (2, 5);\n\
INSERT INTO a VALUES (6, 11);\n\
INSERT INTO a VALUES (6, 20);\n\
INSERT INTO a VALUES (4, 2);\n\
INSERT INTO a VALUES (5, 6);\n\
INSERT INTO a VALUES (2, 4);\n\
INSERT INTO a VALUES (3, 7);\n\
INSERT INTO a VALUES (4, 6);\n\
INSERT INTO a VALUES (2, 7);\n\
INSERT INTO a VALUES (6, 9);\n\
INSERT INTO a VALUES (6, 10);\n\
\n\
-- All good here\n\
INSERT INTO b VALUES (2, 'b', 'Description');\n\
INSERT INTO b VALUES (3, 'c', 'Description\n\
2nd line of description');\n\
INSERT INTO b VALUES (1, 'a', 'Description');\n\
INSERT INTO b VALUES (4, 'd', 'Description\n\
2nd line of description\n\
3rd line of description');\n\
INSERT INTO b VALUES (5, 'e', 'Description');";
/*/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/document.body.innerHTML='<code><pre></pre></code>';console = {log:function(input){document.getElementsByTagName('pre')[0].innerHTML+=input+'\n'}};

var blockRegex = /((?:\bINSERT\s+INTO\s+[^\s]+\s+VALUES\s*\((?:[^"')]+|"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')*\);[\r\n\\]*)+)/i,
rowsRegex = /(?:\bINSERT\s+INTO\s+[^\s]+\s+VALUES\s*\((?:[^"')]+|"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')*\);[\r\n\\]*)/ig,
result = data.split(blockRegex),
resultRows;

for (var i = 0; i < result.length; i++) {
resultRows = result[i].match(rowsRegex);
if (resultRows) {
resultRows.alphanumSort();
result[i] = resultRows.join('');
}
}
data = result.join('');

console.log(data);
<script src="http://www.davekoelle.com/files/alphanum.js"></script>

注意

这使用了此处的自然排序函数:http://www.davekoelle.com/alphanum.html

关于javascript - 根据字符串中的前两个数字对字符串中的行进行重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34477235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com