d3过滤器复制csv中的名称

时间:2017-07-11 14:42:36

标签: javascript csv d3.js

with d3.csv我正在阅读一个csv,然后将其存储起来 console.log(data[0])返回 Object {username: "mark", y: 0, x: 0, value: 0}

现在我想从data中仅提取每个用户名的第一个出现。 在python pandas中我会使用data.drop_duplicates(columns='username')

编辑: 请考虑以下示例:

  var X =  [{username: "a", y: 0, x: 0, value: 0},
    {username: "b", y: 0, x: 0, value: 0},
    {username: "a", y: 1, x: 0, value: 0}
    {username: "c", y: 0, x: 0, value: 0}
    {username: "b", y: 1, x: 0, value: 0}]

它应该只返回:

  var Y =   [{username: "a", y: 0, x: 0, value: 0},
    {username: "b", y: 0, x: 0, value: 0},
    {username: "c", y: 0, x: 0, value: 0}

即。 f(X) = Y

2 个答案:

答案 0 :(得分:1)

由于你想找到每个用户名的第一个匹配项,这个问题与D3无关,可以用普通的JavaScript解决。

有几种方法可以做到这一点。一个简单的问题是使用Array.prototype.find()

  

find()方法返回满足提供的测试函数的数组中第一个元素的值。 (强调我的)

这是一个演示。首先,我们将用户名的唯一值作为数组获取:

var users = [...new Set(data.map(function(d) {
    return d.username
}))];

然后,我们使用mapfilter来获得第一次出现:

var firstOccurrence = users.map(function(d) {
    return data.find(function(e) {
        return e.username === d
    })
});

查看演示:

var data = [{
  username: "a",
  y: 0,
  x: 0,
  value: 0
}, {
  username: "b",
  y: 0,
  x: 0,
  value: 0
}, {
  username: "a",
  y: 1,
  x: 0,
  value: 0
}, {
  username: "c",
  y: 0,
  x: 0,
  value: 0
}, {
  username: "b",
  y: 1,
  x: 0,
  value: 0
}];

var users = [...new Set(data.map(function(d) {
  return d.username
}))]

var firstOccurrence = users.map(function(d) {
  return data.find(function(e) {
    return e.username === d
  })
});

console.log(firstOccurrence)

答案 1 :(得分:1)

您可以使用Map来跟踪已处理的用户名。使用username作为密钥可确保此值的唯一性。要获得此值的第一次出现而不是最后一次出现,您还必须使用Map.prototype.has()来检查是否已添加了每个特定值。

var X =  [
  {username: "a", y: 0, x: 0, value: 0},
  {username: "b", y: 0, x: 0, value: 0},
  {username: "a", y: 1, x: 0, value: 0},
  {username: "c", y: 0, x: 0, value: 0},
  {username: "b", y: 1, x: 0, value: 0}
];
 
var uniqX = new Map();   // Construct map of unique usernames
X.forEach(x => { 
  if (!uniqX.has(x.username)) uniqX.set(x.username, x);  // Only add, if not present
});

var Y = uniqX.values();  // Retrieve the result set

console.log(...Y);

或者,为了数学美学而重写:

var X = [
  {username: "a", y: 0, x: 0, value: 0},
  {username: "b", y: 0, x: 0, value: 0},
  {username: "a", y: 1, x: 0, value: 0},
  {username: "c", y: 0, x: 0, value: 0},
  {username: "b", y: 1, x: 0, value: 0}
];

function f(_) {
  let uniqX = new Set();
  return _.filter(({username}) => !uniqX.has(username) && uniqX.add(username));  
}

var Y = f(X); 

console.log(...Y);