Javascript 将阵列拆分为包含唯一对象组合的最小子阵列

Javascript 将阵列拆分为包含唯一对象组合的最小子阵列,javascript,node.js,arrays,ecmascript-6,Javascript,Node.js,Arrays,Ecmascript 6,我正在做一个项目,在这个项目中,客户机向我们发送一个包含一些对象的数组,请求中也可能有重复的对象。我们根据名为code的键确定重复对象。下面是一个例子: [{code:10},{code:10},{code:10},{code:20},{code:30}] 在上面的示例数组中,我们有3个重复对象,即{code:10} 我们需要将此请求发送到第三方API,该API也接受数组。问题是,在对该API的单个请求中,我们不能发送重复的对象。因此,我们需要将客户机提供的这个数组分解成一个子数组,然后将每个

我正在做一个项目,在这个项目中,客户机向我们发送一个包含一些对象的数组,请求中也可能有重复的对象。我们根据名为
code
的键确定重复对象。下面是一个例子:

[{code:10},{code:10},{code:10},{code:20},{code:30}]
在上面的示例数组中,我们有3个重复对象,即
{code:10}

我们需要将此请求发送到第三方API,该API也接受数组。问题是,在对该API的单个请求中,我们不能发送重复的对象。因此,我们需要将客户机提供的这个数组分解成一个子数组,然后将每个数组发送给API。 如果我们打破上面提供的样品,我们可以得到

[{code:10},{code:20},code:30}],{code:10}],{code:10}]]
因此,在每个子阵列中,我们都有唯一的对象(不重复) 此外,我们还有一个条件,即第一个子阵列应该包含客户端请求中提供的所有唯一对象

所以,如果我们收到客户的请求,比如

[{code:10},{code:10},{code:10},{code:20},{code:20},{code:30}]
那么最小子阵列应该是

[{code:10}、{code:20}、{code:30}、{code:10}、{code:20}、{code:10}]]
有人能帮我吗?我怎么能像这样破坏阵列?
谢谢你

你可以使用一个减速机从
[[]]
开始,然后根据它是否能找到一个
i
相同的
i
来尝试将每个项添加到连续的子数组中,然后如果它不能将它放在任何子数组中,则附加一个新的子数组

const input=[{code:10},{code:10},{code:10},{code:20},{code:30}]
常量输出=输入。减少((累加器,项)=>{
让foundSpace=false;
累加器.forEach(子数组=>{
if(!foundSpace&&!subArray.find(i=>i.code==item.code)){
子阵推送(项);
foundSpace=true;
}
})
如果(!foundSpace){
蓄能器。推动([项目])
}
回流蓄能器;
}, [[]]);

console.log(output)
这里有一个解决方案,位于
O(n logn)
时间复杂性中。首先对输入数组进行排序。然后迭代数组以创建输出。如果当前与上一个相同,请将其添加到下一个子阵列

let-input=[{code:10},{code:10},{code:10},{code:20},{code:30}];
输入.排序((a,b)=>a.code-b.code);
设arr=[[]];
设idx=0;
设prev=-无穷大;
input.forEach(a=>{
如果(a.代码!==上一个){
idx=0;
}否则{
idx++;
}
arr[idx]=arr[idx]| |[];
arr[idx].push(a);
prev=a.代码;
});

控制台日志(arr)这很简单,我在做了一些修改后找到了答案。我们基本上可以通过3个步骤找到子阵列

  • 找到所有唯一的对象,并将它们推送到一个数组,name
    unique
  • 查找与原始数组的差异
  • 重复,直到有一个不同的左
  • const data=[{code:10},{code:10},{code:10},{code:20},{code:20},{code:30}];
    设温度=数据;
    常量子数组=[];
    while(温度长度){
    //发现独特
    let unique=[];
    temp.map(x=>unique.filter(a=>a.code==x.code).length>0?null:unique.push(x));
    //发现差异
    常量差异=临时过滤器(x=>!唯一包含(x));
    //贮藏
    子阵列推送(唯一);
    温度=温差;
    }
    
    控制台日志(子阵列)这里有一个高效的解决方案,它只解析原始数组一次。我们将跟踪我们在helper
    index
    数组中已经遇到的代码。这样,我们可以立即查找元素的放置位置

    通过这种方式,我们可以使用累加器
    result
    简化一个数组,该累加器将包含所有子数组

    const arr=[{code:10},{code:10},{code:10},{code:20},{code:30}];
    //帮助器数组,用于跟踪使用给定代码放置元素的位置
    设指数=[];
    //我们将把子数组累加到结果数组中
    const result=arr.reduce((结果,el)=>{
    //在第一次相遇时,放入索引为0的子数组
    设指数=指数[el.code]??0;
    //初始化子阵列(如果不存在),然后按
    常量子数组=结果[索引]??[];
    子阵推送(el);
    //将子数组放入结果数组中
    结果[索引]=子阵列;
    //增加索引,使带有此代码的下一项转到下一个子数组
    索引[el.code]=++索引;
    返回结果;
    }, []);
    
    控制台日志(结果)我将遍历所有对象,并检查它是否存在于第一个最小数组中。如果不是,则将其放入第一个最小数组中。如果确实存在,请检查下一个。等等