字典与键和值的数组

时间:2015-01-17 19:09:03

标签: javascript jquery

这个问题与javascript或jQuery有关,无论哪种方法都能更好地完成工作。

我想要做的是创建一个类似于以下内容的对象:

var prodItems = [
    {
        "product": "prod1",
        "item": ["prod1Item1", "prod1Item2"]
    },
    {
        "product": "prod2",
        "item": ["prod2Item1", "prod2Item2", "prod2Item3", "prod2Item4"]
    }
];

有了这个我可以访问这样的成员:

prodItems[1]["product"] is "prod2"

prodItems[1]["item"][0] is "prod2Item1"

我想动态创建这个列表,我对语法感到磕磕绊,比如:

var menuItems;
menuItems.product[0] = "prod1";
menuItems.product[0].item[0] = "prod1Item1";

有人可以就如何做到这一点给我一些指导吗?

编辑,我想创建一个类似

的函数
returnDict("prod2", "prod2Item3")

这将重新排列它:

 prodItems = [
    {
        "product": "prod2",
        "item": ["prod2Item3", "prod2Item1", "prod2Item2", "prod2Item4"]
    },
    {
        "product": "prod1",
        "item": ["prod1Item1", "prod2Item2"]

    }
];

4 个答案:

答案 0 :(得分:2)

构建对象的“指导”是避免这种分别插入每个字符串的方式:

menuItems.product[0].product = "prod1";
menuItems.product[0].item[0] = "prod1Item1";

因为这涉及到大量反复编写相同的内容,这更容易出错并且可读性/可维护性较差。我更喜欢插入更粗粒度的对象:

menuItems.product[0] = {
    product: "prod1",
    item: ["prod1Item1"];
}

编辑:你的编辑提出了一个完全不同的问题,但听起来你想要做的是根据他们的“产品”属性对prodItems的元素进行排序,然后对内部的“items”数组做同样的事情。元件。

我认为最简单的方法是使用Array.sort()和自定义比较函数,该函数在您想要在顶部看到的元素上返回-1。这样的事情(匆匆写完和未经测试):

function returnDict(product, item) {
    prodItems = prodItems.sort(function(a, b) {
        if(a.product === product) {
            return -1;
        } else if(b.product === product) {
            return 1;
        } else {
            return 0;
        }
    });
    prodItems[0].items = prodItems[0].items.sort(function(a, b) {
        if(a === item) {
            return -1;
        } else if(b === item) {
            return 1;
        } else {
            return 0;
        }
    });
    return prodItems;
}

答案 1 :(得分:2)

var menuItems = [];
menuItems.push({product:"prod1",item:[]})
menuItems[menuItems.length-1].item.push("product1Item1")
menuItems[menuItems.length-1].item.push("product1Item2")
menuItems.push({product:"prod2",item:[]})
menuItems[menuItems.length-1].item.push("product2Item1")
menuItems[menuItems.length-1].item.push("product2Item2")
menuItems[menuItems.length-1].item.push("product2Item3")
menuItems[menuItems.length-1].item.push("product2Item4")

答案 2 :(得分:1)

var prodItems = [
    {
        "product": "prod1",
        "item": ["prod1Item1", "prod2Item2"]
    },
    {
        "product": "prod2",
        "item": ["prod2Item1", "prod2Item2", "prod2Item3", "prod2Item4"]
    }
];

alert(prodItems[0].product);

for(var i = 0; i < prodItems.length; i++) {
   alert(prodItems[i].product);
}

答案 3 :(得分:1)

我看到你的问题已得到解答,但我想建议一个小小的改进,以保持你的代码更干(不要重复自己)。您可以使用一个简单的函数,在添加新对象时可以节省一些额外的输入。

var prodItems=[];

function addProduct(productName, items){
    var product={
        product: productName,
        items: items
    };
    prodItems.push(product);
};

//sample use
addProduct("prod2",["prod2Item3", "prod2Item1", "prod2Item2", "prod2Item4"])

如果您需要稍后更改对象结构,这肯定会变得更加灵活。