【问题标题】:JavaScript split array in half juxtapose the first half with second halfJavaScript将数组分成两半将前半部分与后半部分并列
【发布时间】:2020-09-21 15:20:44
【问题描述】:

有什么方法可以将一个数组平均一分为二。然后,将后半部分放在第一个 all 的下方,以便比较新的最终数组是否应该在插槽中接收 0 或 1。

var master_array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38];

var first_half = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19];

var second_half = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38];

var final_usable_array_reduced = [];

因此,给定一个包含 38 个复选框的表单,如果选中第 5、19、37 和 38 个复选框,final_usable_array_reduced 将是

final_usable_array_reduced = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1];

final_usable_array_reduced[4] = **represents the 5th <strong>or</strong> 24th box being checked**

final_usable_array_reduced[18] = **represents the 19th <strong>or</strong> 38th boxes being checked**

【问题讨论】:

  • 那么,缩小后的数组一定有“或”的关系?如果在数组一“或”二的同一位置有1,缩小后的数组一定是1?
  • @Macarthurval 你是对的,这是一个“或”的关系。这就像您将阵列从 38 展平/减少到 19。

标签: javascript jquery arrays flatten


【解决方案1】:

我认为你可以通过一个简单的for 循环来实现这一点,循环覆盖一半的master_arrayor将数组下半部分的值与上半部分的值相匹配:

var master_array = new Array(38).fill(0);
master_array[4] = 1;
master_array[18] = 1;
master_array[36] = 1;
master_array[37] = 1;

let len = master_array.length / 2;
final_usable_array_reduced = new Array(len);
for (let i = 0; i < len; i++) {
  final_usable_array_reduced[i] = master_array[i] | master_array[i + len];
}
console.log(final_usable_array_reduced);

【讨论】:

  • 感谢新的 Array 东西和单曲 |运营商 ES 5.1 及更低版本?我可以用 var 替换 let 吗?
  • @AlexanderDixon 是的,您可以将let 替换为var。而new Array(len) 和按位或运算符| 从第一天就已经存在。
  • @AlexanderDixon 除了我用来初始化master_arrayfill(但可能你不需要),这段代码在IE11 上运行良好。
  • +1 表示逐位洞察。我也从 Twisty 的回答中获得了灵感,并使用了 math.floor 语法。但我要说的是,我知道我们已经到了 2020 年,但不要忘记有人仍在使用 IE 5.5。
【解决方案2】:

检查这个:

var array = [0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0];
var firstHalf = array.slice(0,array.length/2);
var secondHalf = array.slice(array.length/2);
var result = firstHalf.map(function(e,i){
    return e || secondHalf[i];
});

console.log(result);

我在这里所做的是用slice 将数组分成两半(当然,考虑到数组元素是偶数),然后我映射第一个返回 1(或 true,是相同的) ) 如果 firstArray[i]secondArray[1] 为 1。

【讨论】:

  • 这很好。请您使用 ES 5.1 或更低的语法。不习惯新东西并寻求mac浏览器支持。
  • 我只是在 mac Safari 上运行它没有问题!但我要重写它更清楚一点。
  • 对不起手机。意味着 max browser compatible(IE 不支持很多 ES6 简写)
【解决方案3】:

考虑以下内容。

$(function() {
  function addChecks(count, tObj, cont) {
    var i;
    if (cont == undefined) {
      i = 0;
    } else {
      i = parseInt($("input:last").val()) - 1;
      count = i + count;
    }
    for (i; i <= count; i++) {
      $("<input>", {
        type: "checkbox",
        value: (i + 1),
        title: (i + 1)
      }).appendTo(tObj);
    }
  }

  function checksToArray() {
    var arr = [];
    $("input[type='checkbox']").each(function() {
      arr.push($(this).prop("checked"));
    });
    return arr;
  }

  function compHalfArr(a) {
    var arr = [];
    var h = Math.floor(a.length / 2);
    for (var i = 0; i <= h; i++) {
      arr.push(a[i] || a[(i + h)]);
    }
    return arr;
  }

  addChecks(14, $(".section-1"));
  addChecks(14, $(".section-2"), true);

  $("button").click(function() {
    var allChecks = checksToArray();
    var compChecks = compHalfArr(allChecks);
    $(".results").html("<span>" + compChecks.join("</span><span>") + "</span>").find("span:last").remove();
  });
});
.checks input {
  margin-right: 20px;
}

.results span {
  display: inline-block;
  font-family: Arial, sans-serif;
  width: 40px;
  text-align: center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="checks section-1"></div>
<div class="checks section-2"></div>
<button>Check</button>
<div class="results"></div>

您可以使用中途标记进行循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多