从字符串javascript中获取键值对
get key value pairs out from the string javascript
如果我的字符串看起来像这个
"<First key="ab" value="qwerty"/>
<First key="cd" value="asdfg"/>
<First key="ef" value="zxcvb"/>"
我想要以格式输出数据
ab:"qwerty"cd:"asdfg"ef:"zxcvb"
我应该如何编写JS?
查看您尝试的代码会很有用,但有一种方法可以实现:
使用正则表达式来挑选字符串的相关部分。
var regex = /key="([a-zA-Z]+)" value="([0-9a-zA-Z'-'.]+)"/;
函数删除空元素。
var notEmpty = function (el) { return el !== ''; };
split
将字符串放入回车符上的数组中,并使用reduce
通过将正则表达式应用于每个数组元素来构建新对象。
var out = str.split(''n').filter(notEmpty).reduce(function(p, c) {
var match = c.match(regex);
p[match[1]] = match[2];
return p;
}, {});
输出
{
"ab": "qwerty",
"cd": "asdfg",
"ef": "zxcvb"
}
演示
请让你的问题更清楚(你想得到什么样的结果数据类型?),或者尝试以下功能:
var string = '<First key="ab" value="qwerty"/><First key="cd" value="asdfg"/><First key="ef" value="zxcvb"/>'
var ParseMyString1 = function(str){
var arr = str.split(/[</>]+/); //"
//console.log(arr);
var result = [];
for (var i =0; i<arr.length; i++) {
var subStr=arr[i];
if (subStr.length!==0) {
var subArr = subStr.split(/['s"=]+/); //"
//console.log(subArr);
var currObj = {};
var currKey = "";
var currVal = "";
for (var j =0; j<arr.length; j++) {
if (subArr[j]=="key"){
currKey = subArr[++j];
}else if (subArr[j]=="value"){
currVal = subArr[++j];
}
};
currObj[currKey] = currVal;
result.push(currObj);
};
};
console.log("ParseMyString1:");
console.log(result);
};
var ParseMyString2 = function(str){
var arr = str.split(/[</>]+/); //"
//console.log(arr);
var resultObj = {};
for (var i =0; i<arr.length; i++) {
var subStr=arr[i];
if (subStr.length!==0) {
var subArr = subStr.split(/['s"=]+/); //"
//console.log(subArr);
var currKey = "";
var currVal = "";
for (var j =0; j<arr.length; j++) {
if (subArr[j]=="key"){
currKey = subArr[++j];
}else if (subArr[j]=="value"){
currVal = subArr[++j];
}
};
resultObj[currKey] = currVal;
};
};
console.log("ParseMyString2:");
console.log(resultObj);
};
$(document).ready(function(){
ParseMyString1(string);
ParseMyString2(string);
});
这些函数返回的结果如下(对象数组):
ParseMyString1:
[{ab:"qwerty"},{cd:"asdfg"},{ef:"zxcvb"}]
ParseMyString2:
{ab:"qwerty",cd:"asdfg",ef:"zxcvb"}
首先,您的字符串无效(双引号中的双引号)。您要么需要用'"
转义内引号,要么只需用单引号替换内引号。
但是,假设你的数据总是以你显示的格式,这个简单的代码将以你想要的方式提取数据:
var data = "<First key='ab' value='qwerty'/><First key='cd' value='asdfg'/><First key='ef' value='zxcvb'/>";
data = data.replace(/<First /g, " ").replace(/'/>/g, "").replace(/key=/g, "").replace(/value=/g, "").trim();
var ary = data.split(" ");
var iteration = "";
var result = "";
for(var i = 0; i < ary.length; i+=2){
iteration = ary[i].replace(/'/g, "") + ":" + ary[i+1].replace(/'/g, "'"");
alert(iteration);
result += " " + iteration;
}
alert("Final result: " + result);
您的输入是一种XML。最好的办法是这样对待它。我们将把它解析为XML,但要做到这一点,我们需要首先将它封装在一个根元素中:
var str = "<Root>" + input + "</Root>"
我们用解析它
var parser = new DOMParser();
var dom = parser.parseFromString(str, "text/xml");
获取文档元素(Root
):
var docelt = dom.documentElement;
现在,我们可以使用标准的DOM访问接口(如getAttribute
:)对其子级进行循环并构建结果
var result = {};
var children = docelt.children;
for (var i = 0; i < children.length; i++) {
var child = children[i];
result[child.getAttribute('key')] = child.getAttribute('value');
}
> result
< Object {ab: "qwerty", cd: "asdfg", ef: "zxcvb"}
您可以用reduce
或其他您喜欢的东西来替换上面的循环逻辑。
这种方法的优点是它利用了内置的解析器,所以我们最终不会对XML的语法做出假设。例如,如果属性在等号之前或之后有空格,则另一个答案中建议的regexp将失败。如果值包含Unicode字符,则它将失败。如果XML格式不正确,它会以奇怪的方式失败。等等。
相关文章:
- 正在数组中存储键值对
- 如何将新的键/值对元素添加到现有数组
- 从 JSON 获取键值对而不使用 .(DOT) 在 Java 脚本或 jquery 中
- 从字符串javascript中获取键值对
- 如何在Acrobat中使用javascript获取PDF表单字段的所有键值对
- 如何获取对象中的键值对列表
- 从对象的 JSON 数组中获取键值对
- 从键值对的值中获取键值
- Node JS从header中获取键值对
- 如何从具有键/值对对象的数组中获取值
- 如何获取对象中唯一的键值对的值
- 使用jQuery循环并获取JSON数组的键/值对
- 如何从json数据中获取特定的键值对并存储在节点js中的变量中
- 如何从JavaScript对象数组中获取键值对
- 访问JSON对象以获取Resource Bundle键/值对
- 从键值对中获取 json 值,而无需在 meteor 中传递键
- 如何从一组标记中获取键值对
- 如何从键值对列表中获取值
- 如何在键值对中获取输入的名称和值
- 使用jQuery获取JSON中的键/值对中的键名