在将数据从php分配给JS时,JS变量中的数组键的顺序正在发生变化

时间:2017-04-23 07:24:38

标签: javascript smarty

我正在 Prestashop 中处理产品详细信息。在产品页面上,我将所有属性定义到javascript数组中的系统中。

保存产品属性的PHP变量如下:

validate.sh

现在将“$ groups”变量分配给tpl文件中的javacript变量,如下所示:

$groups = array(
   '34' => array( //Here key is attribute group id
            'default_attribute_id' => '105', // default attribute id of this group
            'attributes' => array(  // all the attribute with attr id => attr vaue
                  '105' => 'Small',
                  '115' => 'X-Large',
                  '110' => 'Medium'
             ),  
         ),
    .......
);  

现在当我控制“attributeGroups”的值时,它就失去了属性id的顺序,就像在“$ groups”变量中一样。控制台中的值如下:

{addJsDef attributeGroups = $groups}  

我还尝试过使用foreach循环在“attributeGroups”变量中手动插入值,但结果是相同的。

我不想更改属性ID的顺序。谁可以帮我这个事?为什么在分配给javascript变量时,属性ID的顺序会发生变化。

1 个答案:

答案 0 :(得分:0)

这样它应该创建简单的JS数组(具有固定的元素顺序):

$groups = array(
    '34' => array( //Here key is attribute group id
        'default_attribute_id' => '105', // default attribute id of this group
        'attributes' => array(  // all the attribute with attr id => attr vaue
            ['Small', '105'],
            ['X-Large', '115'],
            ['Medium', '110'],
        ),
    ),
    .......
);

你只是不能使用PHP数组索引,因为它会创建关联数组,它转换为JS对象(因为JS没有关联数组)

结果JS应该是:

var attributeGroups = {
    34: {
        'default_attribute_id': "105",
        'attributes': [
            ["Small", 105],
            ["X-Large", 115],
            ["Medium", 110]
        ]
    }
}

或者您可以在属性数组中添加sort键,并在需要时在JS中对其进行排序(通过Array.sort(callback)):

$groups = array(
    '34' => array( //Here key is attribute group id
        'default_attribute_id' => '105', // default attribute id of this group
        'attributes' => array(  // all the attribute with attr id => attr vaue
            '105' => ['Small', 1],
            '115' => ['X-Large', 2],
            '110' => ['Medium', 3],
        ),
    ),
    .......
);

然后在需要时对其进行排序:

attributeGroups[34].attributes.sort(function (a, b) {
    return a[1] - a[2];
})