繁体   English   中英

通过数组按给定顺序对JSON排序(JavaScript,D3)

[英]Sort JSON by a given order via Array (JavaScript, D3)

我想从代表名称/值列的数组中以给定的顺序对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循环? 谢谢。

您可以将对象用于排序顺序,然后按此值对其进行排序。

 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); 

可以像这样在数组上使用.sort()方法:

data.sort(function (a, b) {return sortBy.indexOf(a.Last) - sortBy.indexOf(b.Last)})

您可以使用sort并使用indexOf来获取位置,但这意味着在每次排序时您都在进行内部循环以获取位置。

在不使用排序的情况下,您可以先通过键索引元素,然后再遍历订单。

 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); 

我确信他们是进行级联的一种更好的方法,但是很快就做了。

您应该根据实际数据运行一些性能测试,以查看性能最佳的产品。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM