从AngularJS通过POST发送“关联数组”

时间:2013-11-07 10:55:31

标签: javascript ajax angularjs

我有一个像'

这样的'过滤器'对象
{
  name: 'text',
  value: 'xxx',
  field: 'firstname'
}

表示字段的过滤器,并在更改输入字段的值时更新。 我尝试以下列方式将其存储在数组中:

$scope.active_filters[filter.field] = filter;

所以我知道哪个字段我得到了哪个过滤器。 过滤应该在服务器端进行,所以我试图将这个数组发送到我的API。

$http.post(url, $scope.active_filters)

正如我在Chrome中看到的那样,我有一个包含所需元素的数组但长度为0

[status: Object]
length: 0
  status: Object
    field: "status"
    name: "text"
    value: "x"
    __proto__: Object
__proto__: Array[0]

但是我的请求中没有发送该对象。如果我通过$scope.active_filters.push(filter)添加对象,则会将其发送到服务器,但它的索引为0而不是我想要的值。

我如何实现两个目标?我的数组中的命名索引并将数据发送到api。

1 个答案:

答案 0 :(得分:3)

我在这里猜测,但你的代码是这样的:

var assoc_array = [];
assoc_array["foo"] = "bar";
assoc_array["ipsum"] = "lorem";

JavaScript不知道像PHP那样的关联数组。 JavaScript有对象,因为一切都是对象(甚至数组),你可以得到这种情况。

不是在数组中设置元素,而是为对象分配属性。这意味着魔法 .length属性不会更新,因为数组仍为空。

如果您将代码更改为:

var assoc_array = {}; // <-- {} instead of []     
assoc_array["foo"] = "bar";
assoc_array["ipsum"] = "lorem";

您将获得一个Object(而不是一个数组)并且您将没有.length属性。

这是你使用数组的方法

var indexed_array = [];
indexed_array[0] = "bar";
indexed_array[1] = "lorem";
indexed_array.length; // 2
indexed_array[100] = "foo";
indexed_array.length; // 101 - arrays are never sparse in JS, PHP will give 3
indexed_array[2]; // undefined