这是我的代码:
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:超出最大调用堆栈大小
我做错了什么?
答案 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_12
和1234_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"]