В моем проекте я застрял в этой задаче. У меня есть массив строк, как это:

var tempArray = [];
tempArray[0]="key1 : value1";
tempArray[1]="key1 : value2";
tempArray[3]="key2 : value1";
tempArray[4]="key2 : value2";
tempArray[5]="key2 : value3";

Теперь я хочу привести что-то вроде этого:

   "key1":"value1","value2"
   "key2":"value1","value2","value3" 

Вы можете использовать JSON или массив, я просто хочу, чтобы результат в этом формате.

0
Code Star 16 Дек 2015 в 13:59

5 ответов

Лучший ответ

Попробуйте эту функцию ... Я не знаю, есть ли конкретная функция для этого, но я делаю функцию, которая будет делать то, что вы хотите ...

function getMultArray(temp) {

  var newArray = {};
  var key;
  var oldValue = null;
  var tempA = [];
  var i = 0;
  var j = 0;
  $.each(temp, function(k, value) {
    var newValue = value.split(" : ");
    j++;
    if (oldValue === newValue[0]) {
      tempA.push(newValue[1]);
      if (temp.length == j) {
        newArray[oldValue] = tempA;
        tempA = [];
      }
    } else {

      if (i === 0) {
        i = 1;
        oldValue = newValue[0];
        tempA.push(newValue[1]);
        if (temp.length == 1) {

          newArray[oldValue] = tempA;
          tempA = [];
        }
      } else {
        newArray[oldValue] = tempA;
        tempA = [];
        tempA.push(newValue[1]);
        oldValue = newValue[0];
        if (temp.length == j) {

          newArray[oldValue] = tempA;
          tempA = [];
        }
      }

    }
  });
  return newArray;
}


var tempArray = [];
tempArray[0] = "key1 : value1";
tempArray[1] = "key1 : value2";
tempArray[2] = "key2 : value1";
tempArray[3] = "key2 : value2";
tempArray[4] = "key2 : value3";
var newArray = getMultArray(tempArray);
$.each(newArray, function(key, value) {
  $.each(value, function(i, value) {
    $("#result").html($("#result").html()+"<br/>"+key + "-" + value);
    
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id='result'></div>
1
Anand Singh 16 Дек 2015 в 11:12

Попробуй это

(function() {
  var tempArray = [];
  tempArray[0] = "key1 : value1";
  tempArray[1] = "key1 : value2";
  tempArray[3] = "key2 : value1";
  tempArray[4] = "key2 : value2";
  tempArray[5] = "key2 : value3";

  function parse() {
    var _tempArr = {}

    tempArray.forEach(function(item) {
      var k = item.replace(/\s+/, "").split(":");
      if (_tempArr[k[0]] !== undefined) {
        _tempArr[k[0]].push(k[1]);
      } else {
        _tempArr[k[0]] = [];
        _tempArr[k[0]].push(k[1]);
      }
    });

    console.log(_tempArr);
  }

  parse();

})()
1
Rajesh 16 Дек 2015 в 11:09

Вы можете использовать reduce здесь для хорошего эффекта.

var out = tempArray.reduce(function (p, c) {
  var arr = c.split(' : '), key = arr[0], value = arr[1];
  p[key] = p[key] || [];
  p[key].push(value);
  return p;
}, {});

Обратите внимание, что это дает вам объект, значением которого являются массивы. Вы можете получить к ним доступ следующим образом:

out.key1[0] // value1

ДЕМО

2
Andy 16 Дек 2015 в 11:53

Вы можете использовать Array.prototype.reduce () чтобы преобразовать ваш массив так, как вам нравится:

var output = tempArray.reduce(function(result, item) {
    var key = item.split(":")[0].trim();
    var value = item.split(":")[1].trim();
    if (result[key]) {
        result[key].push(value);
    } else {
        result[key] = [value];
    }
    return result;
}, {});
3
madox2 16 Дек 2015 в 11:02

Я предлагаю изменить формат данных на более сжатый стиль, используя только key, например, 'key1' и value, как 'value1', а не комбинированную строку, такую как {{X4} } .

Результатом является объект с ключами в качестве свойств и значениями в качестве элементов в массиве.

var object = {};

function addValueWithKey(key, value) {
    object[key] = object[key] || [];
    object[key].push(value);
}

addValueWithKey('key1', 'value1');
addValueWithKey('key1', 'value2');
addValueWithKey('key2', 'value1');
addValueWithKey('key2', 'value2');
addValueWithKey('key2', 'value3');

document.write('<pre>' + JSON.stringify(object, 0, 4) + '</pre>');
1
Nina Scholz 16 Дек 2015 в 13:01