递归:如何删除

时间:2016-06-03 23:34:25

标签: javascript loops

这是我的代码:

var asset = ['1234_12', '1234_34', '1234_33', '4321_22', '4321_90'];

var largest = removeElements(asset);

function removeElements(asset) {
    var retVal = [];
    for (i = 0; i < asset.length; i++) {
        for (var j = 0; j < asset.length; j++) {
            if (asset[i].split('_')[0] == asset[j].split('_')[0]) {
                if (asset[i].split('_')[1].split('.')[0] > asset[j].split('_')[1].split('.')[0]) {
                    retVal = removeElements(asset, asset[j]);
                    for (var k = 0; k < retVal.length; k++) {
                        for (var l = 0; l < retVal.length; l++) {
                            if (retVal[k].split('_')[0] == retVal[l].split('_')[0]) {
                                removeElements(retVal);
                            } else {
                                return retVal;
                            }
                        }
                    }
                }
            }
        } 
    }
    return retVal;
}

这里是数组的结构:

var asset = ['1234_12', '1234_34', '1234_33', '4321_22', '4321_90'];

我想要的是在'1234''4321'系列中获得最大值。例如,在这种情况下,我需要抓取'1234_34''4321_90'

  

RangeError:超出最大调用堆栈大小

我做错了什么?

2 个答案:

答案 0 :(得分:4)

以下是一些可以获取这些值的示例(请参阅jsbin):

var asset = ['1234_12', '1234_34', '1234_33', '4321_22', '4321_90'];

var ids = _.values(_.mapValues(asset.reduce(function(agg, curr) {
  var parts = curr.split('_');

  agg[parts[0]] = agg[parts[0]] || [];

  agg[parts[0]].push(parts[1]);

  return agg;
}, {}), function(value, key) {
  return [key, Math.max.apply(Math, value)].join('_');
}));

console.log(ids); // => ["1234_34", "4321_90"]

为方便起见,它使用lodash,但如果没有它,原则是相同的。

首先,将每个字符串拆分为前缀和后缀的键值对(因此1234_121234_34等等,变为{ 1234: ['12', '34'] })。然后,您只需找到该数组中的最大值,然后使用其键将其连接回来。

答案 1 :(得分:4)

你使它变得比你自己更难。您可以迭代每个项目并将匹配的值存储在对象中:

var asset = ['1234_12', '1234_34', '1234_33', '4321_22', '4321_90'];
var intermediate = {};
asset.forEach(function(v) {
  var parts = v.split('_');
  var key = parts[0];
  var val = parts[1];
  if (!intermediate[key] || intermediate[key] < val) {
    intermediate[key] = val;
  }
});

这会产生一个像:

这样的对象
{"1234": "34", "4321": "90"}

然后可以将其转换为预期的数组:

var output = Object.keys(intermediate).map(function(key) {
  return key + '_' + intermediate[key];
});
console.log(output); // ["1234_34", "4321_90"]

查看.forEach.mapObject.keys