动态构建数组,附加值

时间:2012-03-01 19:48:47

标签: javascript jquery arrays

我在这个options中有一堆select,每个都有value个像:

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);
}

6 个答案:

答案 0 :(得分:1)

现有代码通过更改

起作用
 vals=[];

 vals={};

http://jsfiddle.net/BrxuM/

答案 1 :(得分:1)

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];
    });
}

以下是演示:http://jsfiddle.net/jasper/xtfm2/1/

答案 2 :(得分: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(","));

工作示例:http://jsfiddle.net/Zjamy/

答案 3 :(得分:0)

我想这很有效,但如果有人可以优化它,我很乐意看到。

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);
}

答案 4 :(得分:0)

这样的事情对你有用吗?

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

如果您选择了3个选项,则optionArray应包含option1, option2, option3之类的内容。

答案 5 :(得分:-1)

好吧,你不希望vals[key]成为一个数组 - 你希望它是一个字符串。所以试着做

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