Вы эффективно ищете линзы, которые могут абстрагироваться от таких операций, а также предоставлять несколько целей. Существуют различные реализации JS, хотя я не нашел таких списков. С ними это выглядело бы как
set(onList(property("foo")), [App1, App2, App3]);
Но это уродливое, не так ли? И вы просили новые функции ES6.Да, Proxy
может помочь нам сделать это гораздо более красивым, действительно:
ListProxy(App1, App2, App3).foo = "bar";
Вот как бы реализовать такую функцию:
const ListProxy = (() => {
const handler = {
set(target, property, value) {
for (const t of target)
t[property] = value;
},
get(target, property) {
if (typeof target == "function")
target = target.values;
const maybe = target.filter(x => property in Object(x));
if (maybe.length == 0) return undefined;
let values = maybe.map(x => x[property]);
if (values.every(v => typeof v == "function")) {
function fnList(...args) {
return maybe.map(v => v[property](...args));
}
fnList.values = values;
values = fnList;
}
return new Proxy(values, handler);
}
};
return function ListProxy(...args) { return new Proxy(args, handler); };
})();
Метод get
не является жизненно важным, но это допускает более глубокие цепочки и даже вызовы функций вместо назначений:
ListProxy({value:"ax"}, {value:"by"}).value[0].toUpperCase(); // ["A","B"]
Нет, этого не существует на этом языке. Я не думаю, что мне когда-либо приходилось делать это за пределами массива, поэтому «карта» всегда отлично работала для меня –
Да, это то, что я сейчас использую. Просто любопытно, есть ли вещь ES6/7, которая делает это возможным. – samcorcos
Вы ищете * Объективы * :-) – Bergi