Javascript 按键连接js数组的值

Javascript 按键连接js数组的值,javascript,arrays,Javascript,Arrays,我想通过键将数组的值连接到另一个数组。例如,对于下面的输入数组 [['value', 'element1'],['value', 'element2'], ['value1', 'element1'], ['value', null]] 我想要一个输出 [['value', 'element1', 'element2'], ['value1', 'element1']] 有什么办法可以做到这一点吗?试试看 var data=""; var j=0; var i=0;

我想通过键将数组的值连接到另一个数组。例如,对于下面的输入数组

[['value', 'element1'],['value', 'element2'], ['value1', 'element1'], ['value', null]]
我想要一个输出

[['value', 'element1', 'element2'], ['value1', 'element1']]
有什么办法可以做到这一点吗?

试试看

var data="";
    var j=0;
    var i=0;
    var array1 = [['value', 'element1'],['value', 'element2'], ['value1', 'element1'], ['value', null]];
    var array2 = [];    
    $.each(array1, function(index,value){       

        if(value[1] != null)
        {
            if(data == value[0])
            {
                j++;
                array2[i][j] = value[1];
            }
            else
            {
                i++;
                j = 1;
                data = value[0];
                array2[i] = [];
                array2[i][0] = value[0];
                array2[i][j] = value[1];
            }
        }
    });
    console.log(array2);
=>输出

[['value', 'element1', 'element2'], ['value1', 'element1']]

可以使用临时对象将第一个元素作为键保存。然后在最后遍历该对象以构建结果数组

var tmp={}
变量数据=['value','element1'],['value','element2'],['value1','element1'],['value',null]];
data.forEach(函数(elem){
if(!tmp.hasOwnProperty(elem[0])&&elem[1]){
tmp[elem[0]]=elem;
}else if(元素[1]){
tmp[elem[0]].push(elem[1]);
}
});
var results=Object.keys(tmp).map(函数(键){
返回tmp[键];
});
document.getElementById('pre').innerHTML=JSON.stringify(结果)
简单介绍一下数据就可以解决这个问题。通常,您会使用一个对象将值映射到键,然后将键/值映射到一个新数组,但在这种情况下,您可以改为使用索引以返回数组中的嵌套数组为目标

var out = data.reduce(function (p, c) {

  // the key is the first array element, the value the second
  // and i is the index of the nested array in the returned array
  var key = c[0],
      val = c[1],
      i = +key.substr(5) || 0;

  // if the nested array in the returned array doesn't exist
  // create it as a new array with the key as the first element
  p[i] = p[i] || [key];

  // if the value is not null, push it to the correct
  // nested array in the returned array
  if (val) p[i].push(val);
  return p;
}, []);

在Map reduce方法中使用技巧

function groupMap(array){
    var list = array.reduce(accumulate,{});
    return Object.keys(list).map(function(k){
        return [k].concat(list[k])
    })
}

function accumulate(result,a){
    var vector = a.slice(1); // Vector of the values
    if (result.hasOwnProperty(a[0])){ // Already have the key in the result?
    if (vector.length>0 && vector[0])
        result[a[0]] = result[a[0]].concat(vector)
  }
  else{ // new key
    if (vector.length>0 && vector[0])
        result[a[0]] = vector;
     else
        result[a[0]] = []
  }
  return result;
}

var array = [['value', 'element1'],['value', 'element2'], ['value1', 'element1'], ['value', null]];
var result = groupMap(array);

console.log(result); // Check the output
它的工作原理

  • 通过累积数组中每个键的值,可以“减少”数组。其中键由第一个元素表示
  • 简化后的结果是JSON对象
  • 然后将该对象“映射”回数组
  • 完成了
var ref=['value','element1'],['value','element2'],['value1','element1'],['value',null],,
结果=[],[];
参考过滤器(功能(e){
对于(变量i=0;i
您可以尝试对数组进行基本迭代并对其进行操作。如果您正在进行大量此类操作,我建议您使用lodash,但不要使用jQuery。如果存在
值2
,该怎么办?
function groupMap(array){
    var list = array.reduce(accumulate,{});
    return Object.keys(list).map(function(k){
        return [k].concat(list[k])
    })
}

function accumulate(result,a){
    var vector = a.slice(1); // Vector of the values
    if (result.hasOwnProperty(a[0])){ // Already have the key in the result?
    if (vector.length>0 && vector[0])
        result[a[0]] = result[a[0]].concat(vector)
  }
  else{ // new key
    if (vector.length>0 && vector[0])
        result[a[0]] = vector;
     else
        result[a[0]] = []
  }
  return result;
}

var array = [['value', 'element1'],['value', 'element2'], ['value1', 'element1'], ['value', null]];
var result = groupMap(array);

console.log(result); // Check the output
var ref = [['value', 'element1'],['value', 'element2'], ['value1', 'element1'], ['value', null]],
results = [[], []];

ref.filter(function (e) {
  for (var i = 0; i < e.length; i++) {
    if (e[i] && results[0].indexOf(e[i]) === -1) {
      results[0].push(e[i]);
    } else if (e[i]) {
      results[1].push(e[i]);
    }
  }
});