Javascript lodash-如果所有值都为空,则从datatable(2D矩阵)中删除列
我有一个像这样的2D矩阵,第一行是列名,其他行是值Javascript lodash-如果所有值都为空,则从datatable(2D矩阵)中删除列,javascript,lodash,Javascript,Lodash,我有一个像这样的2D矩阵,第一行是列名,其他行是值 var datatable = [ ["a", "b", "c", "d"], //first row are columns names [ 1, 0, null, 3 ], //other rows are values [ 6, null, null, 8 ] ]; 我希望在所有值均为null时删除列,结果如下: var datatable = [ ["a", "b", "d"],
var datatable = [
["a", "b", "c", "d"], //first row are columns names
[ 1, 0, null, 3 ], //other rows are values
[ 6, null, null, 8 ]
];
我希望在所有值均为null
时删除列,结果如下:
var datatable = [
["a", "b", "d"], //first row are columns names
[ 1, 0, 3 ], //other rows are values
[ 6, null, 8 ]
];
行和列的数量可能会有所不同。如果有一种紧凑而快速的方法可以用lodash实现,那就太完美了。您可以首先获得所有
null
值的列,然后过滤行
var-datatable=[[“a”、“b”、“c”、“d”],[1,0,null,3],[6,null,null,8],
cols=数据表
.slice(1)//省略标题
.reduce((r,a)=>a.map((v,i)=>r[i]| | v!==null),[]);
datatable=datatable.map(a=>a.filter((u,i)=>cols[i]);
console.log(数据表)代码>
.as console wrapper{max height:100%!important;top:0;}
您可以首先获取包含所有null
值的列,然后过滤行
var-datatable=[[“a”、“b”、“c”、“d”],[1,0,null,3],[6,null,null,8],
cols=数据表
.slice(1)//省略标题
.reduce((r,a)=>a.map((v,i)=>r[i]| | v!==null),[]);
datatable=datatable.map(a=>a.filter((u,i)=>cols[i]);
console.log(数据表)代码>
.as控制台包装{max height:100%!important;top:0;}
代码稍长,但思想类似
var数据表=[
[“a”、“b”、“c”、“d”],
[1,0,null,3],
[6,空,空,8]
];
/*首先创建一个简单的key-val映射,如{a:[1,6],b:[0,null]等,以清除所有为null的键*/
让keyValMap=datatable.reduce((acc、arr、index)=>{
如果(索引==0){
arr.forEach(键=>{
如果(!acc[键])
acc[键]=[]
});
}否则{
Object.keys(acc.map)((key,index)=>acc[key].push(arr[index]);
}
返回acc;
},{});
//现在,只提取那些不是每个元素都为null的键
让validKeys=Object.keys(keyValMap).filter(key=>!keyValMap[key].every(i=>i==null));
//从keyValMap向后旋转基于validKeys的值
让updatedDataTable=[validKeys,…validKeys.map(key=>keyValMap[key])。reduce((acc,val)=>{
val.forEach((elem,i)=>{
如果(!acc[i])acc[i]=[];
acc[i]。推送(元素)
});
返回acc;
},[]) ]
log(updatedDataTable);
代码稍长,但思想类似
var数据表=[
[“a”、“b”、“c”、“d”],
[1,0,null,3],
[6,空,空,8]
];
/*首先创建一个简单的key-val映射,如{a:[1,6],b:[0,null]等,以清除所有为null的键*/
让keyValMap=datatable.reduce((acc、arr、index)=>{
如果(索引==0){
arr.forEach(键=>{
如果(!acc[键])
acc[键]=[]
});
}否则{
Object.keys(acc.map)((key,index)=>acc[key].push(arr[index]);
}
返回acc;
},{});
//现在,只提取那些不是每个元素都为null的键
让validKeys=Object.keys(keyValMap).filter(key=>!keyValMap[key].every(i=>i==null));
//从keyValMap向后旋转基于validKeys的值
让updatedDataTable=[validKeys,…validKeys.map(key=>keyValMap[key])。reduce((acc,val)=>{
val.forEach((elem,i)=>{
如果(!acc[i])acc[i]=[];
acc[i]。推送(元素)
});
返回acc;
},[]) ]
console.log(updatedDataTable);
使用.flow()
创建一个函数,该函数使用..unzip()
转换数组,拒绝具有所有空值的数组,然后将数组解压回原始形式:
const{flow,partiOK:pr,unzip,reject,tail,every,isNull}=\u;//转换为导入
常数fn=流量(
解压,
pr(拒绝、流动(尾部、pr(每个、为空)),
解压,
);
常量数据表=[
[“a”、“b”、“c”、“d”],//第一行是列名
[1,0,null,3],//其他行是值
[6,空,空,8]
];
const result=fn(数据表);
console.log(结果);
使用.flow()
创建一个函数,该函数使用..unzip()
转换数组,拒绝包含所有空值的数组,然后将数组解压回原始形式:
const{flow,partiOK:pr,unzip,reject,tail,every,isNull}=\u;//转换为导入
常数fn=流量(
解压,
pr(拒绝、流动(尾部、pr(每个、为空)),
解压,
);
常量数据表=[
[“a”、“b”、“c”、“d”],//第一行是列名
[1,0,null,3],//其他行是值
[6,空,空,8]
];
const result=fn(数据表);
console.log(结果);
这里是我使用map()
、filter()
和some()
的方法
var数据表=[
[“a”、“b”、“c”、“d”],
[1,0,null,3],
[6,空,空,8]
];
设res=datatable.map(
x=>x.filter((\ux,idx)=>datatable.slice(1).some(arr=>arr[idx]!==null))
);
console.log(res);
这里有我使用map()
、filter()和some()的方法
var数据表=[
[“a”、“b”、“c”、“d”],
[1,0,null,3],
[6,空,空,8]
];
设res=datatable.map(
x=>x.filter((\ux,idx)=>datatable.slice(1).some(arr=>arr[idx]!==null))
);
console.log(res);
因为第二个数组中有一个值,因为该列的所有值都必须为null才能删除第三个列中有c
。为什么要删除?因为第一行是列名称,它们永远不能为null。如果需要,这就像Excel表格一样……因为第二个数组中有一个值,因为所有值都是null第三列中有c
。为什么会被删除?因为第一行是列名,它们永远不能为空。如果您想。。。