自己的JS map / filter set属性

时间:2018-05-24 09:08:00

标签: javascript

想使用单行使用mapfilter次迭代在对象/数组中设置属性

目前代码看起来像这样(示例查询参数提取)...

var q = {};

var q = location.search.substr(1).split('&').map(function(a){
    q[a.split('=')[0]] = a.split('=')[1] // q must be defined primarily?!
});

是否有解决方法可以在不预先定义q变量的情况下完成此操作,可能位于

附近
var q = location.search.substr(1).split('&').map(function(a){
    this[a.split('=')[0]] = a.split('=')[1] // this doesn't work obviously
});

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用闭包并添加一个被破坏的数组。



var q = Object.assign(...'foo=bar&baz=42'
        .split('&')
        .map(s => (([k, v]) => ({ [k]: v }))(s.split('=')))
    );
        
console.log(q);




这里是ES5



var q = 'foo=bar&baz=42'
        .split('&')
        .reduce(function (o, s) {
            return function (kv) {
                o[kv[0]] = kv[1];
                return o;
            }(s.split('='));
        }, {});
        
console.log(q);




答案 1 :(得分:1)

您可以使用reduce()方法:



const locationSearch = '?a=b&c=d&e=f';

const q = locationSearch.substr(1).split('&').reduce((acc, x) => {
  const [key, value] = x.split('=');
  acc[key] = value;
  return acc;
}, {});

console.log(q);




我在这个答案中使用了一些ES6功能:constarrow functionsdestructuring。遗憾的是,IE10不支持这些功能,因此您必须使用Babel转换代码或不使用这些功能。下面的代码应该适用于IE10:



var locationSearch = '?a=b&c=d&e=f';

var q = locationSearch.substr(1).split('&').reduce(function (acc, x) {
  var keyAndValue = x.split('=');
  var key = keyAndValue[0];
  var value = keyAndValue[1];
  acc[key] = value;
  return acc;
}, {});

console.log(q);