不可变数组的问题

时间:2017-02-23 10:25:25

标签: javascript angularjs d3.js

最近我开始使用D3.js绘制晒伤图。数据以JSON格式提供。对于一些设计的东西,我想交换一些项目(在D3 doc中称为childrens)。 我知道在JS数组中是对象......所以像这样:

var buffer = myarray[2];

只是一个参考。因此,交换缓冲区没有效果(?)。 因此,我在我的代码中发明了第二个数组(childrens_final),它在交换过程中采用了这些项目。它只是遍历每个项目,第二次迭代是查找具有相同名称的项目来连续设置具有相同名称的项目。因此交换。

var childrens = response_data.data.data['children'];
var childrens_final = []
for (var child = 0; child < childrens.length; child++) {
    var category = childrens[child];
    var found = false;
    var i = child+1
    while (!(found) && (i < childrens.length)) {
        if (childrens[i]['name'] == category['name']) {
            var childrens = swapArrayElements(childrens, child+1, i);
            var one = childrens[child];
            var two = childrens[child+1]
            found = true;
            }
            i++;
            }
            if (found) {
                childrens_final.push(one);
                childrens_final.push(two);
                child++;
            }
            else {
                childrens_final.push(childrens[child])
            }
        }
response.data.data['children'] = childrens_final;
return response.data.data;

函数swapArrayElements()只是使用splice:

function swapArrayElements(list, x, y) {
    if (list.length ==1) return list;
    list.splice(x, 1, list.splice(y,1, list[x])[0]);
    return list;
}

问题是图表中的交换仍然没有效果。但是当记录childrens_final时。控制台中有类似的东西:

Array [ Object, Object, Object, Object, Object, Object, Object, Object, Object ]

对象的顺序正确!但是在阵列中仍然存在旧秩序。 这实际上是如此基本,但我没有看到解决方案。

顺便说一句......代码在AngularJS下运行。

1 个答案:

答案 0 :(得分:1)

发现问题。这是D3.js的问题。 D3正在对数据本身进行排序。您必须明确设置:

d3.layout.partition.sort(null)

否则每个预先排序过程都没有效果。