Javascript 在数组数组中查找重复项并对其进行处理
具有数组中的数据和Oth位置的重复数组。 解释 将阵列与其第零位进行比较,使结果准确Javascript 在数组数组中查找重复项并对其进行处理,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,具有数组中的数据和Oth位置的重复数组。 解释 将阵列与其第零位进行比较,使结果准确 let array = [["2018-03-09", 10, 11, 0],["2018-03-10", 100, 101, 105],["2018-03-15", 20, 0, 25],["2018-03-09", 0, 0, 15],["2018-03-15", 0, 10, 0]] let output = []; for (let i = 0; i < array.length; i++) {
let array = [["2018-03-09", 10, 11, 0],["2018-03-10", 100, 101, 105],["2018-03-15", 20, 0, 25],["2018-03-09", 0, 0, 15],["2018-03-15", 0, 10, 0]]
let output = [];
for (let i = 0; i < array.length; i++) {
let key = array[i][0]
let index = output.findIndex(x => x[0] == key)
if (index >= 0) {
for (let k = 1; k < array[i].length; k++) {
if (array[i][k] >= output[index][i]) {
output[index][k] = array[i][k]
} else {
output[index][k] = output[index][i]
}
}
} else {
output.push(array[i])
}
}
console.log(output)
如何实现这一点?您可以使用查找对象查找具有相同值的以前条目,然后合并它们。数组分解有助于使代码干净:
const byDate = {};
const result = [];
for(const [date, ...values] of array) {
if(byDate[date]) {
values.forEach((v, i) => byDate[date][i + 1] = Math.max(byDate[date][i + 1], v));
} else {
result.push(byDate[date] = [date, ...values]);
}
}
可以使用查找对象查找具有相同值的以前条目,然后合并它们。数组分解有助于使代码干净:
const byDate = {};
const result = [];
for(const [date, ...values] of array) {
if(byDate[date]) {
values.forEach((v, i) => byDate[date][i + 1] = Math.max(byDate[date][i + 1], v));
} else {
result.push(byDate[date] = [date, ...values]);
}
}
为了更好的可读性,您可以在一个单独的函数中更新数组(我为您使用的循环方法保留了
,尽管我们可以在这里使用forEach()
调用)
在这里,updateEntry将在输出数组(entries
参数)中查找现有的条目
,如果发现该条目,则进行更新,否则它将将将其附加到输出数组中
下面是一个工作片段
函数更新尝试(条目,条目){
for(设i=0;i=条目[i][j])
分录[i][j]=分录[j];
}
返回;
}
条目。推送(条目);
}
让数组=[
["2018-03-09", 10, 11, 0],
["2018-03-10", 100, 101, 105],
["2018-03-15", 20, 0, 25],
["2018-03-09", 0, 0, 15],
["2018-03-15", 0, 10, 0]
];
让输出=[];
for(设i=0;i 控制台日志(输出)
为了更好的可读性,您可以在一个单独的函数中更新数组(我保留了您使用的循环方法,尽管我们可以在这里使用forEach()
调用)
在这里,updateEntry将在输出数组(entries
参数)中查找现有的条目
,如果发现该条目,则进行更新,否则它将将将其附加到输出数组中
下面是一个工作片段
函数更新尝试(条目,条目){
for(设i=0;i=条目[i][j])
分录[i][j]=分录[j];
}
返回;
}
条目。推送(条目);
}
让数组=[
["2018-03-09", 10, 11, 0],
["2018-03-10", 100, 101, 105],
["2018-03-15", 20, 0, 25],
["2018-03-09", 0, 0, 15],
["2018-03-15", 0, 10, 0]
];
让输出=[];
for(设i=0;i 控制台日志(输出)代码>使用array.reduce构建一个以标识符(日期)为键的对象,它将其他三个值相加。然后,使用Object.values返回所需的数组输出
let数组=[[“2018-03-09”,10,11,0],“2018-03-10”,100,101,105],“2018-03-15”,20,0,25],“2018-03-09”,0,0,15],“2018-03-15”,0,10,0];
让输出=对象.值(数组.减少((r,e)=>{
var k=e[0];
如果(!r[k])r[k]=[k,0,0,0];
r[k][1]+=e[1];
r[k][2]+=e[2];
r[k][3]+=e[3];
返回r;
}, {}));
控制台日志(输出)代码>使用array.reduce构建一个以标识符(日期)为键的对象,它将其他三个值相加。然后,使用Object.values返回所需的数组输出
let数组=[[“2018-03-09”,10,11,0],“2018-03-10”,100,101,105],“2018-03-15”,20,0,25],“2018-03-09”,0,0,15],“2018-03-15”,0,10,0];
让输出=对象.值(数组.减少((r,e)=>{
var k=e[0];
如果(!r[k])r[k]=[k,0,0,0];
r[k][1]+=e[1];
r[k][2]+=e[2];
r[k][3]+=e[3];
返回r;
}, {}));
控制台日志(输出)代码>请缩进您的代码,这很难阅读。您应该让前面的数组缩进就位。现在我们有一个不规则的水平滚动条…请缩进你的代码,这很难阅读。你应该让前面的数组缩进到位。现在我们有了一个不规则的水平滚动条…@amesshil well15+0
将产生与Math相同的结果。max(15,0)
,很难判断需要哪种行为。@amesshil但你是对的,从代码中可以清楚OP想要什么,并进行相应的编辑。谢谢你的提示:)@Jonaswills你能为这个问题提供解决方案吗@amesshil well15+0
将产生与Math相同的结果。max(15,0)
,很难说需要哪种行为。@amesshil但你是对的,从代码中可以清楚OP想要什么,并进行了相应的编辑。谢谢你的提示:)@jonaswillms你能为这个问题提供解决方案吗