从字符串javascript中获取键值对

get key value pairs out from the string javascript

本文关键字:获取 键值对 javascript 字符串      更新时间:2024-02-11

如果我的字符串看起来像这个

"<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格式不正确,它会以奇怪的方式失败。等等。