【问题标题】:Split array into arrays of matching values将数组拆分为匹配值的数组
【发布时间】:2023-03-24 22:20:01
【问题描述】:

我有一个类似的值数组:

["100", "330", "22", "100", "4.7", "0.01", "0.01", "330", "0.01", "100", "47", "22", "100", "0.01"]

使用 JavaScript,我想将此数组拆分为多个数组,其中只有匹配的字符串在这些数组中,如下所示:

["100", "100", "100"]
["330", "330"]
["22", "22"]
["0.01", "0.01", "0.01", "0.01"]
["47"]
["4.7"]

对此的任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 我还没有尝试过任何东西,我对 JavaScript 还比较陌生,不知道从哪里开始
  • 这部分似乎无效:"0.01, "330", 0.01"

标签: javascript arrays


【解决方案1】:

您可以使用Map 收集并获取值作为结果。

由内而外:

  • Array#reducedata 一起使用,并将Map 实例用作initialValue
  • 作为回调获取Map#set 并收集每个组的值。

    其他方法:

  • 从地图中获取值并将其用作参数

  • Array.from。这会生成一个包含所有值的数组。

var data = ["100", "330", "22", "100", "4.7", "0.01", "0.01", "330", "0.01", "100", "47", "22", "100", "0.01"],
    result = Array.from(data
        .reduce((m, v) => m.set(v, [...(m.get(v) || []), v]), new Map)
        .values()
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 谢谢,我喜欢这个解决方案!您能否也为我添加一些 cmets 以帮助我理解和学习我正在使用的代码:)
【解决方案2】:

使用reduce方法和Object.values

   //Go thru each value in `arr` array and convert into object with 
   //keys as unique (value in array) and values array of value repetitions.


   {
     "100": ["100", "100"],
     "22": ["22"],
     ...
     ...    
   }

   //Use the Object.values to get the Values as array of arrays

const arr = ["100", "330", "22", "100", "4.7", "0.01", "0.01", 
             "330", "0.01", "100", "47", "22", "100","0.01"];

const updated = Object.values(
  arr.reduce(
    (acc, curr) => (
      (acc[curr] = curr in acc ? [...acc[curr], curr] : [curr]), acc
    ),
    {}
  )
);

console.log(updated);

【讨论】:

  • 展开累加器是一种不好的做法。考虑返回累加器。
  • @Siva 你能向我解释一下代码,以便我更好地理解它吗?我喜欢理解我正在使用的代码!
  • 当然@Alex 我会尽快添加详细信息。
  • @AlexMorrison,用 cmets 更新了答案。希望对您有所帮助。
  • @SivaKondapiVenkata 你让它变得比它必须的复杂得多
【解决方案3】:

这是使用reduce 按值分组的另一种方法。

它简化为一个对象,然后将其转换为数组数组。

let valueArray = ["100", "330", "22", "100", "4.7", "0.01", "0.01", "330", "0.01", "100", "47", "22", "100", "0.01"];

let groupedByValue = Object.values(valueArray
  .reduce((acc, x)=>{
   	  let arr = acc[x] || [];
   	  arr.push(x);
   	  acc[x] = arr;
   	  return acc;
   },{}));
 
console.log(groupedByValue);

额外

这是一个按相同格式对唯一值进行分组的版本。
当这个问题最初被您真正完全误解时,这是一个捏造的东西。 (它发生了......)

let valueArray = ["100", "330", "22", "102", "4.7", "0.01", "0.02", "330", "0.01", "101", "47", "23", "100", "0.02"];

let groupedByFormat = Object.values(valueArray
  .reduce((acc, x)=>{
   	  let val = x.trim();
   	  let format = val.replace(/\d/g,'0');
   	  let arr = acc[format] || [];
   	  if(!arr.includes(val)) {
   		arr.push(val);
   		acc[format] = arr.sort();
   	}
   	return acc;
   },{}));
 
console.log(groupedByFormat);

【讨论】:

    【解决方案4】:

    也可以这样:

    const {log} = console;
    const arr = ["100", "330", "22", "100", "4.7", "0.01", "0.01", "330", "0.01", "100", "47", "22", "100", "0.01"];
    log([...new Set(arr)].map( x => arr.filter( y => y === x )));
    

    【讨论】:

      【解决方案5】:

      这是一个使用 Set 的示例。

      const data = ["100", "330", "22", "100", "4.7", "0.01", "0.01", "330", "0.01", "100", "47", "22", "100", "0.01"];
      
      const unique = new Set(data);
      for(let num of unique) {
        console.log(data.filter(d => d == num));
      }

      【讨论】:

        猜你喜欢
        • 2016-08-09
        • 1970-01-01
        • 2011-06-15
        • 1970-01-01
        • 2016-10-05
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多