Javascript 动态构建数组,附加值

Javascript 动态构建数组,附加值,javascript,jquery,arrays,Javascript,Jquery,Arrays,在这个select中,我有一系列选项,每个选项都有值如下: context|cow context|test thing|1 thing|5 thing|27 context|beans 在循环遍历选项时,我想构建一个数组,检查键是否存在,如果不存在,则生成键,然后附加值。然后在下一个循环中,如果键存在,则添加下一个值,逗号分隔 理想的输出是: arr['context'] = 'cow,test,beans'; arr['thing'] = '1,5,27'; 这是我到目前为止得到的,但

在这个
select
中,我有一系列
选项
,每个选项都有
如下:

context|cow
context|test
thing|1
thing|5
thing|27
context|beans 
在循环遍历选项时,我想构建一个数组,检查键是否存在,如果不存在,则生成键,然后附加值。然后在下一个循环中,如果键存在,则添加下一个值,逗号分隔

理想的输出是:

arr['context'] = 'cow,test,beans';
arr['thing'] = '1,5,27';
这是我到目前为止得到的,但这不是一个建立价值观的好策略

function sift(select) {
        vals = [];
        $.each(select.options, function() {
            var valArr = this.value.split('|');
            var key = valArr[0];
            var val = valArr[1];
            if (typeof vals[key] === 'undefined') {
                vals[key] = []; 
            }
            vals[key].push(val);
        });
        console.log(vals);
}

我想这是可行的,但如果有人能优化它,我很乐意看到

function updateSiftUrl(select) { var
    vals = {};
    $.each(select.options, function() {
        var valArr = this.value.split('|');
        var key = valArr[0];
        var val = valArr[1];
        if (typeof vals[key] === 'undefined') {
            vals[key] = val;    
            return;
        }
        vals[key] = vals[key] +','+ val;
    });
    console.log(vals);
}

嗯,您不希望
vals[key]
成为一个数组,而是希望它成为一个字符串。所以试着去做吧

        if (typeof vals[key] === 'undefined') {
            vals[key] = '; 
        }
        vals[key] = vals[key] + ',' + val;

你喜欢这个工作吗

$("select#yourselect").change(function(){
    var optionArray =
        $(":selected", $(this)).map(function(){
            return $(this).val();
        }).get().join(", ");
});

如果您选择了3个选项,
optionArray
应该包含类似于
option1、option2、option3的内容

 vals=[];


下面是一个演示:

一个可扩展、可重用、封装的解决方案如何:

function MyOptions()
{
  var _optionNames = [];
  var _optionValues = [];
  function _add(name, value)
  {
    var nameIndex = _optionNames.indexOf(name);
    if (nameIndex < 0)
    {
      _optionNames.push(name);
      var newValues = [];
      newValues.push(value);
      _optionValues.push(newValues); 
    }
    else
    {
      var values = _optionValues[nameIndex];
      values.push(value);
      _optionValues[nameIndex] = values;
    }
  };
  function _values(name)
  {
    var nameIndex = _optionNames.indexOf(name);
    if (nameIndex < 0)
    {
      return [];
    }
    else
    {
      return _optionValues[nameIndex];
    }
  };
  var public = 
  {
    add: _add,
    values: _values
  };

  return public;
}

工作示例:

您最终想做什么?我的直觉是有更好的方法。@mblase75好的观点,我通常说这看起来像是XY问题。
function sift(select) {
    var vals = {};//notice I made an object, not an array, this is to create an associative array
    $.each(select.options, function() {
        var valArr = this.value.split('|');
        if (typeof vals[valArr[0]] === 'undefined') {
            vals[valArr[0]] = ''; 
        } else {
            vals[valArr[0]] += ',';
        }
        vals[valArr[0]] += valArr[1];
    });
}
function MyOptions()
{
  var _optionNames = [];
  var _optionValues = [];
  function _add(name, value)
  {
    var nameIndex = _optionNames.indexOf(name);
    if (nameIndex < 0)
    {
      _optionNames.push(name);
      var newValues = [];
      newValues.push(value);
      _optionValues.push(newValues); 
    }
    else
    {
      var values = _optionValues[nameIndex];
      values.push(value);
      _optionValues[nameIndex] = values;
    }
  };
  function _values(name)
  {
    var nameIndex = _optionNames.indexOf(name);
    if (nameIndex < 0)
    {
      return [];
    }
    else
    {
      return _optionValues[nameIndex];
    }
  };
  var public = 
  {
    add: _add,
    values: _values
  };

  return public;
}
var myOptions = MyOptions();
myOptions.add("context", "cow");
myOptions.add("context","test");    
myOptions.add("thing","1");    
myOptions.add("thing","5");    
myOptions.add("thing","27");    
myOptions.add("context","beans");    

console.log(myOptions.values("context").join(","));
console.log(myOptions.values("thing").join(","));