如何从字符串创建对象数组

时间:2014-09-16 09:12:10

标签: javascript arrays

我正在尝试读取此

的字符串值
[Screen Size]{27 inch}[/Screen Size][Colour]{Silver}[/Colour][Screen Size]{21 inch}[/Screen Size]

成这种格式的数组

[
    {type: "Size", names: ["21 inch", "27 inch"]},
    {type: "Color", names: ["Blue"]}
]

使用javascript

我尝试了几种方法,但尚未提出可行的解决方案

我最近的尝试就是这个

var s = [{Name: '[Screen Size]{27 inch}[/Screen Size][Colour]{Silver}[/Colour][Screen Size]{21 inch}[/Screen Size]'}];

var getVariantsForDisplay = function (s) {
    var variations = [];    
    var values =  {type: undefined, names: []}
    for (var i = 0; i < s.length; i++) {
        var mergedArray = mergeVariants(mapVariant(s[i].Name))
        variations.push(mergedArray);
    }
    return variations;
}


//mapVariant returns {["21 inch","Silver","27 inch"], ["Screen Size","Colour"," Screen Size"]}
var mapVariant = function(s) {
    var re = /\[([\s\S]+?)\]{([\s\S]+?)}\[\/\1\]/g;
    var variants = [];
    var valueObj = {types: [], names: []};
    var x;
    while ((x = re.exec(s)) !== null) {
        var type = x[1];
        var name = x[2];
        valueObj.types.push(type);
        valueObj.names.push(name);
    }
    return valueObj;
}


//merge variants returns {["21 inch", "27 inch"], type: "Screen Size"}
var mergeVariants = function(s) {
    //if the type is the same as one already in an object, get that object and add the name to the names array
    var variant = {type: "", names: []};
    var variants = [];
    for(var i = 0; i < s.types.length; i++) {
        if(variant.type === "")
        {
            variant.type = s.types[i];
            variant.names[i] = s.names[i];

        } else if(variant.type === s.types[i]){
            variant.names[i-1] = s.names[i];
        }
    }
    return variant;
}

正如你所看到的那样,它几乎就在那里,但只是因为我失去了颜色,这应该是它在数组中的自己的对象以及屏幕尺寸。

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

我认为你正在用自己的数据结构制作一根棒。使用带有colorsize个键的对象以及数组作为其值 更容易管理:

var arr = [
  '[Screen Size]{27 inch}[/Screen Size][Colour]{Silver}[/Colour][Screen Size]{21 inch}[/Screen Size]',
  '[Screen Size]{17 inch}[/Screen Size][Colour]{Blue}[/Colour][Screen Size]{41 inch}[/Screen Size]'
];

function getVariants(arr) {
    var out = { color: [], size: [] };
    var regex = /{([a-zA-Z0-9 ]*)}/g
    for (var i = 0, l = arr.length; i < l; i++) {
        var myArray;
        while ((myArray = regex.exec(arr[i])) !== null) {
            if (myArray[1].indexOf('inch') > -1) {
                out.size.push(myArray[1]);
            } else {
                out.color.push(myArray[1]);
            }
        }
    }
    return out;
}

<强> OUT

{
  color: ["Silver", "Blue"],
  size: ["27 inch", "21 inch", "17 inch", "41 inch"]
}

DEMO

这更容易使用的原因是现在您可以使用普通对象访问方法来获取数据:obj.colorobj.size并循环返回的数组。通过使用具有typenames属性的对象数组,它可以更加长时间地获取数据。

例如,要获取数据结构中的大小名称值,需要使用数组操作来获取数据:

var sizenames = arr.filter(function (el) {
  return el.type === 'Size';
})[0].names;

然后你仍然需要循环返回的数组。