Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在数组数组中查找重复项并对其进行处理_Javascript_Arrays_Multidimensional Array - Fatal编程技术网

Javascript 在数组数组中查找重复项并对其进行处理

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++) {

具有数组中的数据和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 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 well
15+0
将产生与
Math相同的结果。max(15,0)
,很难判断需要哪种行为。@amesshil但你是对的,从代码中可以清楚OP想要什么,并进行相应的编辑。谢谢你的提示:)@Jonaswills你能为这个问题提供解决方案吗@amesshil well
15+0
将产生与
Math相同的结果。max(15,0)
,很难说需要哪种行为。@amesshil但你是对的,从代码中可以清楚OP想要什么,并进行了相应的编辑。谢谢你的提示:)@jonaswillms你能为这个问题提供解决方案吗