Javascript - 使用多键对象减少数组

时间:2016-07-27 09:19:20

标签: javascript ecmascript-6

我想修改一个Javascript数组,以便具有相同值的元素指定属性合并到一个对象中,其他属性保存为逗号分隔的字符串,JSON字符串或数组。基本上,我想转此:

[
    {
        "language" : "english",
        "type" : "a",
        "value" : "value1"
    },
    {
        "language" : "english",
        "type" : "a",
        "value" : "value2"
    },
    {
        "language" : "english",
        "type" : "b",
        "value" : "value3"
    },  
    {
        "language" : "spanish",
        "type" : "a",
        "value" : "valor1"
    }
]

进入这个:

[
    {
        "language" : "english",
        "type" : "a",
        "value" : ["value1" , "value2"]  // A Json string is welcome too
    },
    {
        "language" : "english",
        "type" : "b",
        "value" : "value3"
    },  
    {
        "language" : "spanish",
        "type" : "a",
        "value" : "valor1"
    }
]

我尝试过迭代和过滤,然后在代码片段中给出了对象。但我想知道是否有更优雅的方式来做到这一点。

还欢迎P.S EcmaScript6和其他JS库建议。

var originalArray = [
	{
		"language" : "english",
		"type" : "a",
		"value" : "value1"
	},
	{
		"language" : "english",
		"type" : "a",
		"value" : "value2"
	},
	{
		"language" : "english",
		"type" : "b",
		"value" : "value3"
	},	
	{
		"language" : "spanish",
		"type" : "a",
		"value" : "valor1"
	}
];

var resultingArray = [];

// iterate through the original array
$.each(originalArray, function(i, val) {
  // apply filter on key properties (i.e. language and type)
  var result = resultingArray.filter(function( obj ) {
    return (obj.language === val.language && obj.type === val.type);
  });
  // if a record exists, update its value
  if (result.length === 1) {  
    result[0].value += (", " + val.value);
  } 
  // else, add value
  else if (result.length === 0) {
    resultingArray.push(val);
  }
  // if multiple rows exist with same key property values...
  else {
    alert("Too many records with language '" + val.language + "' and type '" + val.type + "'");
  }
});

console.log(JSON.stringify(resultingArray));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

1 个答案:

答案 0 :(得分:0)

这是你需要的吗?

var baseData= [
    {
        "language"  : "english",
        "type" : "a",
        "value" : "value1"
    },
    {
        "language" : "english",
        "type" : "a",
        "value" : "value2"
    },
    {
        "language" : "english",
        "type" : "b",
        "value" : "value3"
    },  
    {
        "language" : "spanish",
        "type" : "a",
        "value" : "valor1"
    }
];

var newData = [];
baseData.forEach(function(item, index) {
  if (newData.length === 0) {
    newData.push(item);
    
  } else {
    var dIndex = -1;
    newData.forEach(function(itm, idx) {
      if (item.language === itm.language && item.type === itm.type) dIndex = idx;
    });
    
    if (dIndex !== -1) {
      var oldValue = newData[dIndex].value;
      
      if (typeof(oldValue).toString() === 'string') {
        newData[dIndex].value = [oldValue, item.value];
      }
    } else {
      newData.push(item);
    }
  }
});
console.log(newData);