【问题标题】:Grouping arrays and get the last and first array for every group对数组进行分组并获取每个组的最后一个和第一个数组
【发布时间】:2017-08-03 06:26:54
【问题描述】:

假设我有一个看起来像这样的示例数组。

代码输出如下所示

[[2131, 2016-01-01, 1:00 PM, FA1], [2131, 2016-01-01, 2:00 PM, FA1], [2131, 2016-01-01, 3:00 PM, FA1], [2132, 2016-01-02, 4:00 PM, FA1].....]

我怎样才能让它看起来像这样?

我的意思是始终按日期对数据进行分组,并且只获取每个组的最后一组数据和第一组数据

我希望你明白我的意思 TYSM

【问题讨论】:

  • 我们看到您从表格中删除了 3 行。这些行是根据某些逻辑删除的吗?
  • 是的,先生。假设根据第一列和第二列将数组分组到一个数组中,然后只得到第一列和最后一个。类似的东西

标签: javascript arrays google-apps-script


【解决方案1】:

好的。根据您给出的输入,我已经构建了数组并获得了所需的输出。希望对您有所帮助。

var inputarr = [ [ 2131, "2016-01-01", "1:00 PM", "FA1" ],
        [ 2131, "2016-01-01", "2:00 PM", "FA1" ],
        [ 2131, "2016-01-01", "3:00 PM", "FA1" ],
        [ 2132, "2016-01-02", "4:00 PM", "FA1" ],
        [ 2132, "2016-01-02", "5:00 PM", "FA1" ],
        [ 2132, "2016-01-02", "6:00 PM", "FA1" ],
        [ 2133, "2016-01-03", "7:00 PM", "FA1" ],
        [ 2133, "2016-01-03", "8:00 PM", "FA1" ],
        [ 2133, "2016-01-03", "9:00 PM", "FA1" ] ];

map = {};
for ( var element in inputarr) {
    if (!map[inputarr[element][1]]) {
        map[inputarr[element][1]] = [];
    }
    map[inputarr[element][1]].push(inputarr[element]);
}

output = [];

for ( var key in map) {
    output.push(map[key].shift());
    output.push(map[key].pop());
}

console.log(output);

输出:

[ [ 2131, '2016-01-01', '1:00 PM', 'FA1' ],
  [ 2131, '2016-01-01', '3:00 PM', 'FA1' ],
  [ 2132, '2016-01-02', '4:00 PM', 'FA1' ],
  [ 2132, '2016-01-02', '6:00 PM', 'FA1' ],
  [ 2133, '2016-01-03', '7:00 PM', 'FA1' ],
  [ 2133, '2016-01-03', '9:00 PM', 'FA1' ] ]

【讨论】:

  • TYSSM 先生的努力,但先生,我认为这不是 javascript
  • 我的错 :) 在某处编写 pyton 代码。在 JS 中也很简单。稍后将使用该代码对其进行编辑。
  • 将代码转换为 JavaScript。希望对您有所帮助。
  • tysm 先生寻求帮助
  • 先生,您的代码似乎是最接近的答案,请问我有什么问题吗?
【解决方案2】:

你可以这样做

let arr = [[2131, "2016-01-01", "1:00 PM", "FA1"], [2131, "2016-01-01", "2:00 PM", "FA1"], [2131, "2016-01-01", "3:00 PM", "FA1"]
            , [2132, "2016-01-02", "4:00 PM", "FA1"], [2132, "2016-01-02", "5:00 PM", "FA1"], [2132, "2016-01-02", "6:00 PM", "FA1"]
            , [2133, "2016-01-03", "7:00 PM", "FA1"], [2133, "2016-01-03", "8:00 PM", "FA1"], [2133, "2016-01-03", "9:00 PM", "FA1"]]
let startMap = {};
let endMap = {};
let dateArray = [];
let resultArray = [];

for(let element of arr){
    console.log(element);
    if(startMap[element[1]] === undefined){
        startMap[element[1]] = element;
        dateArray.push(element[1]);
    }
    endMap[element[1]] = element;
}

for(let date of dateArray){
    resultArray.push(startMap[date]);
    resultArray.push(endMap[date]);
}
console.log(resultArray);

【讨论】:

    【解决方案3】:

    你可以使用这个 ES6 脚本:

    const data = [
        [2131, "2016-01-01", "1:00 PM", "FA1"], 
        [2131, "2016-01-01", "2:00 PM", "FA1"], 
        [2131, "2016-01-01", "3:00 PM", "FA1"],
        [2132, "2016-01-02", "4:00 PM", "FA1"],
        [2132, "2016-01-02", "5:00 PM", "FA1"],
        [2132, "2016-01-02", "6:00 PM", "FA1"], 
        [2133, "2016-01-03", "7:00 PM", "FA1"],
        [2133, "2016-01-03", "8:00 PM", "FA1"],
        [2133, "2016-01-03", "9:00 PM", "FA1"]
    ];
    
    const result = [].concat(...data.reduce( (acc, a) =>
        acc.set(a[1], (acc.get(a[1]) || []).slice(0, 1).concat([a]))
    , new Map).values());
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    说明

    reduce 与空的Map 一起用作起始值。然后用日期作为键填充Map,并将匹配的原始值作为每个键的数组值填充。对于slice,只有这样一个数组的第一个条目被维护,而新条目被添加到它。这样一来,每个数组中最多只能有 2 个值。

    一旦reduce 返回了最终的Map,就会使用values 从中提取值,并作为参数传播到concat,这将再次使其成为平面数组。

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 2021-04-06
      • 2013-12-01
      • 2019-06-27
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多