避免使用多个映射和过滤器来压缩和过滤javascript中的对象数组

时间:2017-05-26 20:16:03

标签: javascript arrays

我有一个像

这样的对象数组
var someObjects = [
{'label': 'VS', 'value': 1 },
{'label': 'V1', 'value': 2 },
{'label': 'V2', 'value': 3 },
{'label': 'V3', 'value': 4 },
{'label': 'V4', 'value': 5 },
{'label': 'V5', 'value': 6 },
{'label': 'V6', 'value': 7 },
{'label': 'V7', 'value': 8 },
{'label': 'V8', 'value': 9 },
{'label': 'V9', 'value': 10 },
{'label': 'V10', 'value': 11 },
{'label': 'V11', 'value': 12 },
{'label': 'V12', 'value': 20 },
{'label': 'V13', 'value': 15 },
{'label': 'VE', 'value': 13 }
];

我需要按顺序生成新数组

[
{'label': 'VS', 'value': 1 },
{'label': 'V1', 'value': 2 },
{'label': 'V2', 'value': 3 },
{'label': 'V3', 'value': 4 },
{'label': 'V4', 'value': 5 },
{'label': 'V5', 'value': 6 },
{'label': 'V6', 'value': 7 },
{'label': 'V7', 'value': 8 },
{'label': 'V8', 'value': 9 },
{'label': 'V9', 'value': 10 },
{'label': 'V10+', 'value': 15 },
{'label': 'VE', 'value': 13 }
];

在这里,我必须找到具有最大值V的对象的查找值,并且所有其他对象应保持相同。

我正在做的是我正在使用 - .filter for< 10 || 'S' - 。找10 - .find over map获取最大值 - .find for'T'

似乎很复杂。有什么建议吗?

更新 以下是我尝试的fiddle。仍然必须在数组上执行findmap然后reduce。有什么建议可以简化这个吗?

1 个答案:

答案 0 :(得分:0)

您可以循环遍历数组并使用收集ten对象的闭包来减少它。

var array = [{ label: 'VS', value: 1 }, { label: 'V1', value: 2 }, { label: 'V2', value: 3 }, { label: 'V3', value: 4 }, { label: 'V4', value: 5 }, { label: 'V5', value: 6 }, { label: 'V6', value: 7 }, { label: 'V7', value: 8 }, { label: 'V8', value: 9 }, { label: 'V9', value: 10 }, { label: 'V10', value: 11 }, { label: 'V11', value: 12 }, { label: 'V12', value: 20 }, { label: 'VE', value: 13 }],
    result = array.reduce(function (ten) {
        return function (r, a) {
            var n = +a.label.match(/\d+$/);
            if (n >= 10) {
                if (!ten) {
                    ten = { label: 'V10+', value: 0 };
                    r.push(ten);
                }
                ten.value = Math.max(ten.value, a.value);
            } else {
                r.push(a);
            }
            return r;
        };
    }(), []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }