【问题标题】:How to get all combinations of array elements after removing each element删除每个元素后如何获取数组元素的所有组合
【发布时间】:2018-07-21 02:41:26
【问题描述】:

我想在删除每个元素后得到所有数组元素的所有组合

例如:

输入:[6,5,3,4]

输出应该是:[[5,3,4],[6,3,4],[6,5,4],[6,5,3]]

不使用任何库

我在这段代码中工作,但没有输出正确的结果

    var arrs = [[]];
    
    function doIt(arr) {
        for (var i = 0; i < arr.length; i++) {
            arrs[i] = arr.filter(function (item) {
                return item != i
            });
        }
    
        console.log(JSON.stringify(arrs));
    }
    
    doIt([4, 3, 1]);

【问题讨论】:

  • 好主意,你有没有尝试过?
  • 是的,检查一下pastebin.com/ZkuzF0FK
  • 请在问题中添加您尝试过的内容。
  • 您可以利用递归模式。第一个子列表开头没有6,但其余的都有。
  • 您遇到问题的代码是什么?你的代码有什么问题?您收到错误消息吗?错误信息是什么?你得到的结果不是你期望的结果吗?你期望什么结果,为什么,你得到的结果是什么,两者有什么不同?您正在观察的行为不是期望的行为吗?期望的行为是什么,为什么,观察到的行为是什么,它们有何不同?请提供minimal reproducible example在问题中

标签: javascript arrays algorithm


【解决方案1】:

您可以通过迭代给定数组和映射数组来使用嵌套方法,而无需外部索引的元素。

var array = [6, 5, 3, 4],
    result = array.map((_, i) => array.filter((_, j) => i !== j));

console.log(result);

在您的代码中,您需要检查过滤器回调的索引而不是值。

var arrs = [[]];

function doIt(arr) {
    for (var i = 0; i < arr.length; i++) {
        arrs[i] = arr.filter(function (item, j) {
        //                                   ^ use index instead of value
            return j != i;
            //     ^                           here                
        });
    }
    console.log(arrs);
}
doIt([4, 3, 1]);

【讨论】:

  • “好主意,你有没有尝试过?”但还是发布了答案......
  • 是的 - 所以我的代码是正确的,但我只是比较了值而不是索引 - 非常感谢
【解决方案2】:

简单的forEach + filter

只需比较索引即可过滤下一个元素。

var result = [];
var array = [6,5,3,4];
array.forEach((_, i) => result.push(array.filter((_, j) => i !== j)));

console.log(result);

【讨论】:

  • 如果数组有重复元素,这将不起作用。
  • @AaditMShah 哎呀,我的错。我需要比较索引,更新答案!
【解决方案3】:

无需复杂,它确实是一个简单的算法。

var input = [6,5,3,4];
var output = [];
for (i = 0; i < input.length; ++i) {
   temp = [];
   for (j = 0 ; j < input.length; ++j) {
      if (i != j)
          temp.push(input[j]);
   }
   output.push(temp);
}
console.log(output);

【讨论】:

  • OP 不要求输出字符串,而是要求嵌套数组。
  • 他现在做到了吗? Atm 我认为它被表述为“输出应该是”
  • 你注意到输出中的括号和逗号了吗?那是一个嵌套数组。与输入的外观(也是一个数组)进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 2011-01-24
相关资源
最近更新 更多