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

时间:2018-10-25 12:48:12

标签: 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 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)

必需的输出

output=[["2018-03-09",10,11,15],["2018-03-10",100,101,105],["2018-03-15",20,10,25]]

我该如何实现?

3 个答案:

答案 0 :(得分:2)

您可以使用查找对象查找具有相同值的先前条目,然后合并它们。数组解构有助于使代码清晰:

 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]);
  }
 }

答案 1 :(得分:0)

为了获得更好的可读性,您可以在单独的函数中更新数组(我保留了您使用的for循环方法,尽管我们可以在此处使用forEach()调用)。

在这里,updateEntry将在输出数组(entries参数)中查找现有的entry,如果找到则进行更新,否则会将其附加到输出数组中。

在有效代码段下面。

function updateEntry(entries, entry) {
  for (let i = 0; i < entries.length; i++) {
    if (entry[0] != entries[i][0]) continue;
    for (let j = 1; j < entry.length; j++) {
      if (entry[j] >= entries[i][j])
        entries[i][j] = entry[j];
    }
    return;
  }
  entries.push(entry);
}

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++) {
  updateEntry(output, array[i]);
}

console.log(output);

答案 2 :(得分:0)

使用array.reduce构建一个以标识符(日期)为键的对象,该对象将其他三个值相加。然后,使用Object.values返回所需的数组输出。

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 = Object.values(array.reduce((r, e) => {
  var k = e[0];
  
  if (!r[k]) r[k] = [k, 0, 0, 0];

  r[k][1] += e[1];
  r[k][2] += e[2];
  r[k][3] += e[3];
 
  return r;
}, {}));

console.log(output);