在 javascript 中进行左外连接
make a left outer join in javascript
我在 javascript (D3) 中有一个对象数组,我需要删除另一个对象属性数组中存在某个属性的每个对象,
即左外连接
(来源:tazindeed.co.uk)
我设法自己完成了 2 个循环,但速度很慢。
而且我不知道如何让它更快。
for (var i = 0; i < data1.length; i++) {
for (var j = 0; j < data2.length; j++) {
if (data2[j].attr3 == data1[i].attr4) {
data2.splice(j,1);
}
}
}
data1.length~2k and data2.length~10k
我知道大约有人问过这个问题 here 但已经快 2 年了,解决方案使用外部库。
我只是想知道是否有更好的方法 javascript(或 jQuery 或 D3,我已经使用过)
感谢您的帮助!
您需要快速查找 data1
中存在的值,因此使用对象制作地图:
var map = {};
for (var i = 0; i < data1.length; i++) {
map[data1[i].attr4] = 1;
}
然后您可以遍历 data2
中的项目并过滤它们:
var result = [];
for (i = 0; i < data2.length; i++) {
if (!(data2[i].attr3 in map)) {
result.push(data2[i]);
}
}
你可以使用 Array.filter
(参见 MDN)或 Array.map
我想:
var array1 = [1,2,3,4,5,6,7,8,9],
array2 = [3,4,5,6],
fltr = array1.filter( function(v) {return this.indexOf(v) < 0;}, array2),
map = array1.map(
function(v) {
var exists = this.indexOf(v);
return [v, (this[exists] || 'null')].join(', ');},
array2),
result = document.querySelector('#result');
fltr.unshift('<u>array1</u>');
map.unshift('<u>array1, array2</u>');
result.innerHTML = ['<b>filtered</b>\n',
fltr.join('\n'),
'\n\n<b>mapped</b>\n',
map.join('\n')].join('');
<pre id="result"></pre>
也许不会更快但更易读
const left = ['1', '2', '7']
const right = ['1', '3', '5', '9']
const result = left.filter((x) => !right.includes(x))
我在 javascript (D3) 中有一个对象数组,我需要删除另一个对象属性数组中存在某个属性的每个对象,
即左外连接
(来源:tazindeed.co.uk)
我设法自己完成了 2 个循环,但速度很慢。
而且我不知道如何让它更快。
for (var i = 0; i < data1.length; i++) {
for (var j = 0; j < data2.length; j++) {
if (data2[j].attr3 == data1[i].attr4) {
data2.splice(j,1);
}
}
}
data1.length~2k and data2.length~10k
我知道大约有人问过这个问题 here 但已经快 2 年了,解决方案使用外部库。
我只是想知道是否有更好的方法 javascript(或 jQuery 或 D3,我已经使用过)
感谢您的帮助!
您需要快速查找 data1
中存在的值,因此使用对象制作地图:
var map = {};
for (var i = 0; i < data1.length; i++) {
map[data1[i].attr4] = 1;
}
然后您可以遍历 data2
中的项目并过滤它们:
var result = [];
for (i = 0; i < data2.length; i++) {
if (!(data2[i].attr3 in map)) {
result.push(data2[i]);
}
}
你可以使用 Array.filter
(参见 MDN)或 Array.map
我想:
var array1 = [1,2,3,4,5,6,7,8,9],
array2 = [3,4,5,6],
fltr = array1.filter( function(v) {return this.indexOf(v) < 0;}, array2),
map = array1.map(
function(v) {
var exists = this.indexOf(v);
return [v, (this[exists] || 'null')].join(', ');},
array2),
result = document.querySelector('#result');
fltr.unshift('<u>array1</u>');
map.unshift('<u>array1, array2</u>');
result.innerHTML = ['<b>filtered</b>\n',
fltr.join('\n'),
'\n\n<b>mapped</b>\n',
map.join('\n')].join('');
<pre id="result"></pre>
也许不会更快但更易读
const left = ['1', '2', '7']
const right = ['1', '3', '5', '9']
const result = left.filter((x) => !right.includes(x))