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
答案 0 :(得分:1)
由于你想找到每个用户名的第一个匹配项,这个问题与D3无关,可以用普通的JavaScript解决。
有几种方法可以做到这一点。一个简单的问题是使用Array.prototype.find():
find()方法返回满足提供的测试函数的数组中第一个元素的值。 (强调我的)
这是一个演示。首先,我们将用户名的唯一值作为数组获取:
var users = [...new Set(data.map(function(d) {
return d.username
}))];
然后,我们使用map
和filter
来获得第一次出现:
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);