从字符串javascript中获取键值对

时间:2016-04-06 16:19:15

标签: javascript

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

"<First key="ab" value="qwerty"/>
<First key="cd" value="asdfg"/>
<First key="ef" value="zxcvb"/>"

我希望以格式

获取数据

AB:&#34; QWERTY&#34; CD:&#34; asdfg&#34; EF:&#34; zxcvb&#34;

我应该如何编写JS?

4 个答案:

答案 0 :(得分:3)

查看您尝试过的代码会很有用,但这是您可以实现的方法:

使用正则表达式来挑选字符串的相关部分。

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"
}

DEMO

答案 1 :(得分:0)

请更清楚地说明您的问题(您希望获得哪种结果数据类型?),或尝试以下功能:

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"}

答案 2 :(得分:0)

首先,您的字符串无效(双引号内的双引号)。您需要使用\"转义内部引号,或者只使用单引号替换内部引号。

但是,假设您的数据始终采用您显示的格式,这个简单的代码将以您希望的方式提取数据:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

您的输入是一种XML。最好的方法就是这样对待它。我们将其解析为XML,但为此,我们需要首先将其包装在根元素中:

var str = "<Root>" + input + "</Root>"

我们用

解析它
var parser = new DOMParser();
var dom = parser.parseFromString(str, "text/xml");

获取文档元素(Root):

var docelt = dom.documentElement;

现在我们可以使用getAttribute之类的标准DOM访问接口来遍历其子代并构建我们的结果:

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的语法做出假设。例如,如果属性在等号之前或之后具有空格,则在另一个答案中建议的正则表达式将失败。如果值包含Unicode字符,则会失败。如果XML格式错误,它将以奇怪的方式失败。等等。