如何通过连接和取消它们来折叠两个阵列,但主要是保持位置

时间:2015-12-10 08:18:59

标签: javascript arrays

我想将两个数组折叠在一起并保留其位置

expect(fold([1, 2, 4], [2, 3, 4])).to.eql([1, 2, 3, 4])
expect(fold([5, 1, 17, 9, 3], [1, 17, 2, 9])).to.eql([5, 1, 17, 2, 9, 3])

我的最终目标是拥有此

expect(diff([a, b, d, e], [b, c, d])).to.eql({
  foldedList: [a, b, c, d],
  added: [c], // elements that where in 2nd but not in 1st array
  removed: [e]  // elements that where in 1st but not in 2nd array
})

对于addedremoved的东西,有解决方案,但我没有发现数组的折叠。

3 个答案:

答案 0 :(得分:1)

尝试将此作为您的第一个目标

function fold(_a, _b){
  var result = [];
  for(var ind = 0, ln = Math.max(_a.length, _b.length); ind < ln; ind++){
    if (_a[ind] && result.indexOf(_a[ind]) === -1) result.push(_a[ind]);
    if (_b[ind] && result.indexOf(_b[ind]) === -1) result.push(_b[ind]);
  }
  return result;
}

答案 1 :(得分:0)

我有一个稍微复杂的解决方案

function fold(arr1, arr2, sort) {
  function byOrigPositions(a, b) {
    var indexA1 = arr1.indexOf(a)
    var indexA2 = arr2.indexOf(a)
    var indexB1 = arr1.indexOf(b)
    var indexB2 = arr2.indexOf(b)
    if (indexA1 >= 0 && indexB1 >=0) {
      return indexA1 - indexB1
    }
    if (indexA2 >= 0 && indexB2 >=0) {
      return indexA2 - indexB2
    }
    if (sort) {
      return sort(a, b)
    }
    return 0
  }

  return arr2.reduce(function(res, el) {
    if (res.indexOf(el) < 0) {
      res.push(el)
    }
    return res;
  }, [].concat(arr1)).sort(byOrigPositions)
}

它在concat之后排序,并使用原始数组中的位置作为排序函数。作为奖励,如果无法通过这种方式计算出位置,您可以将排序功能作为第三个参数。

答案 2 :(得分:0)

我发现了一个相当丑陋的答案,但它比我之前的答案更好:

    public void gv_Sorting(object sender, GridViewSortEventArgs e)
    {

  Response.Write("<script>alert('Wrong messages!')</script>");

        Response.Write("<script type='text/javascript' language='javascript'> alert('Test')</script>");

        Page.ClientScript.RegisterStartupScript(this.GetType(), "Alert", "<script type='text/javascript'>alert('blah');</script>");

        Response.Write("<script language=JavaScript> alert('Hello'); </script>");

        Response.Write(@"<script language='javascript'>alert('The following errors have occurred: sldka fhig vqjq  hucxvibg yo7 .');</script>");

         ScriptManager.RegisterStartupScript(this, typeof(Page), "UpdateMsg", "$(document).ready(function(){alert('Overrides successfully Updated.');});", true);

Page.RegisterStartupScript("LoadTxtBox", "<script language='javascript'>LoadTxtBox(\"" + item.Cells[0].Text + "\", " + x + ")</script>");


<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
        function LoadTxtBox(txt, txtBoxNumber) {

            document.getElementById("MainContent_txt_" + txtBoxNumber + "").Text = txt;
        }

它在两个数组之间切换,并尝试在另一个数组中查找当前元素。如果它找到它,它会切换对两个数组的引用,并以相反的方式做同样的事情。