我想从表示名称/值列的数组中给定一定顺序的JSON数组。一个例子是:
data = [
{
First: "John",
Last: "Doe",
Age: 23
},
{
First: "Sue",
Last: "San",
Age: 13
},
{
First: "Kyle",
Last: "Wafer",
Age: 87
}
];
var sortBy = ["San", "Wafer", "Doe"];
这样我的输出就是:
var newData = [
{
First: "Sue",
Last: "San",
Age: 13,
},
{
First: "Kyle",
Last: "Wafer",
Age: 87,
},
{
First: "John",
Last: "Doe",
Age: 23,
}
];
是否可以使用D3.js或基本JavaScript实现而无需复杂的for循环?谢谢。
答案 0 :(得分:2)
您可以使用对象作为排序顺序,并按此值对其进行排序。
var data = [{ First: "John", Last: "Doe", Age: 23 }, { First: "Sue", Last: "San", Age: 13 }, { First: "Kyle", Last: "Wafer", Age: 87 }],
sortBy = ["San", "Wafer", "Doe"],
sortByObj = {};
sortBy.forEach(function (a, i) {
sortByObj[a] = i + 1;
});
data.sort(function (a, b) {
return (sortByObj[a.Last] || 0) - (sortByObj[b.Last] || 0);
});
console.log(data);
答案 1 :(得分:1)
可以在数组上使用.sort()
方法,如下所示:
data.sort(function (a, b) {return sortBy.indexOf(a.Last) - sortBy.indexOf(b.Last)})
答案 2 :(得分:0)
您可以使用sort并使用indexOf来获取位置,但这意味着您正在进行内部循环以获取位置。
不使用sort,您可以先通过键索引元素,而不是循环遍历订单。
data = [
{
First: "John",
Last: "Doe",
Age: 23
},
{
First: "Sue",
Last: "San",
Age: 13
},
{
First: "Kyle",
Last: "Wafer",
Age: 87
}
];
var sortBy = ["San", "Wafer", "Doe"];
var temp = data.reduce( function(obj, item) {
obj[item.Last] = item;
return obj;
}, {});
var result = sortBy.map( function(key){ return temp[key]; });
console.log(result);

但是这种技术失败的地方是两个密钥会重复。为了解决这个问题,可以使用数组来完成。
data = [
{
First: "John",
Last: "Doe",
Age: 23
},
{
First: "Jane",
Last: "Doe",
Age: 20
},
{
First: "Sue",
Last: "San",
Age: 13
},
{
First: "Kyle",
Last: "Wafer",
Age: 87
}
];
var sortBy = ["San", "Wafer", "Doe"];
var temp = data.reduce( function(obj, item) {
if(!obj[item.Last]) obj[item.Last]=[];
obj[item.Last].push(item);
return obj;
}, {});
var result = sortBy.reduce( function(arr, item){ return arr.concat(temp[item]); return arr }, []);
console.log(result);

我确信他们是进行连接的更好的方式,但做得很快。
您应该根据您的实际数据运行一些性能测试,看看效果如何。