使用JavaScript根据索引合并多个数组

18
我需要将两个数组合并为一个数组。我有代码,但它的工作结果不如预期-- 它是按顺序将它们合并在一起的,但我需要交错值。

<html>

<head>
    <title></title>
    <script src="https://code.jquery.com/jquery-3.1.1.js"></script>
</head>

<body>
    <div id="result"></div>
    <script type="text/javascript">
    var array1 = [1, 2, 3, 4];
    var array2 = ["a", "b", "c", "d"];
    var newArray = $.merge(array1, array2);
    $("#result").html(newArray);
    //the result its 1234absd
    //ineed result like 1a,2b,3c,4d
    </script>
</body>

</html>


1
如果两个数组的长度不同怎么办? - Yogesh Mistry
如果您需要以这种方式合并超过2个数组,我在下面的答案中创建了一个函数。 - Yogesh Mistry
7个回答

26

您可以在纯JavaScript中使用Array#map

var array1 = [1, 2, 3, 4];
var array2 = ["a", "b", "c", "d"];

var newArray = array1.map((e, i) => e + array2[i]);
console.log(newArray);

如果你在array1上使用map,那么第一个参数是循环中array1的当前值,第二个参数是该元素在数组中的索引。因此,您可以使用索引将array1中的当前元素与其他数组中具有相同索引的元素匹配。

var array1 = [1, 2, 3, 4];
var array2 = ["a", "b", "c", "d"];
var array3 = ["f", "d", "s", "a"];

var newArray = array1.map(function(value, index) {
  return value + array2[index] + array3[index];
});
console.log(newArray);


它的工作很好,谢谢,但您能否解释一下这个函数。即我需要3或4个数组来与此函数一起使用,并再次感谢您。 - Shabi Levi
所有的数组长度都相同吗? - Nenad Vracar
这个解决方案针对数组的数量是固定的,不如它本应该是多变的。 - Nina Scholz

11
你可以使用 Array#reduceArray#map 来处理任意数量长度相同的数组。

var a1 = [1, 2, 3, 4],
    a2 = ["a", "b", "c", "d"],
    a3 = [9, 8, 7, 6],
    a4 = ["z", "y", "x", "w"],
    result = [a1, a2, a3, a4].reduce((a, b) => a.map((v, i) => v + b[i]));

console.log(result);

ES5

var a1 = [1, 2, 3, 4],
    a2 = ["a", "b", "c", "d"],
    a3 = [9, 8, 7, 6],
    a4 = ["z", "y", "x", "w"],
    result = [a1, a2, a3, a4].reduce(function (a, b) {
        return a.map(function (v, i) {
            return v + b[i];
        });
    });

console.log(result);


3

注意一点变化,通过索引在一个数组中进行合并,创建一个值的关联数组

const a = [1, 2, 3, 4],
      b = [34, 54, 54, 43]

console.log(
  a.map((e,i) => [e,b[i]])
)


接下来,为了从给定的值中搜索最接近的匹配。 在这个例子中,搜索3.7的最佳相关值:

const a = [1, 2, 3, 4],
      b = [34, 54, 54, 43],
      c = a.map((e,i) => [e,b[i]]),
      search = 3.7,
      temp = [];
      
c.forEach(function(e){
  temp.push(e[0])
})

const seek = temp.reduce((m, n) => (Math.abs(n-search) < Math.abs(m-search) ? n : m))

const index = c.findIndex((s) => s.indexOf(seek) !== -1)
console.log(c[index][1])

这并不是一个对象应该有的表现方式。

例如,相同的索引条目并没有被合并,而是将它们持有的关联值保存在一个新条目中(重复索引)。我们可以从索引中排除数学,并创建转换矩阵。我们可以使用任何列作为索引并进行双向搜索。


1
你可以使用reduceconcatsource)的组合:

var array1 = [1, 2, 3, 4];
var array2 = ["a", "b", "c", "d"];
var newArray = array1.reduce(function(prev, curr) {
  return prev.concat(curr, array2[prev.length / 2]);
}, []);
$("#result").html(newArray);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>


1

实际上,JavaScript缺少一个.zip()函数,这个函数对于你正在尝试做的事情非常有用。让我们来发明它;

Array.prototype.zip = function(a){
 return this.map((e,i) => typeof e === "object" || typeof a[i] === "object" ? [e,a[i]] : e+a[i]);
};

var arrays = [[1, 2, 3, 4],
              ["a", "b", "c", "d"],
              [9, 8, 7, 6],
              ["z", "y", "x", "w"],
              [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
             ],
result = arrays.reduce((p,c) => p.zip(c));
console.log(result);


0
如果有人需要按照上述帖子中提到的方式合并任意数量的数组(长度固定),则以下函数将非常有用。

console.clear();
var array1 = ["a1", "b1", "c1", "d1"];
var array2 = ["a2", "b2", "c2", "d2"];
var array3 = ["a3", "b3", "c3", "d3"];
var array4 = ["a4", "b4", "c4", "d4"];

function mergeElementsAtIndex(one_or_more_arrays){
    const total_arr = arguments.length;
    newArray = arguments[0].map((v, k) => {
   var temp_val = v;
        for(var i=1; i < total_arr; i++){
         temp_val += arguments[i][k];
        }
        return temp_val;
    });
    return newArray;
}
merged_array = mergeElementsAtIndex(array1, array2, array3, array4);
console.log(merged_array);
.as-console-wrapper { max-height: 100% !important; top: 0; }


0
var array1 = [1, 2, 3, 4];
var array2 = ["a", "b", "c", "d"];
var array3 = ["f", "d", "s", "a"];

var newArray = array1.map(function(value, index) {
  return value + array2[index] + array3[index];
});
console.log(newArray);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接