Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6将对象映射到组值_Javascript_Arrays_Ecmascript 6_Javascript Objects - Fatal编程技术网

Javascript ES6将对象映射到组值

Javascript ES6将对象映射到组值,javascript,arrays,ecmascript-6,javascript-objects,Javascript,Arrays,Ecmascript 6,Javascript Objects,我要转换此数组: [{ department: 'HR', person: 'Tom' },{ department: 'Finance', person: 'Peter' },{ department: 'HR', person: 'Jane' }]; 将人员按部门进行分组并更改键 [{ role: 'HR', people: ['Tom','Jane'] },{ role: 'Finance', people: ['Peter'] }] 我使用的

我要转换此数组:

[{
  department: 'HR',
  person: 'Tom'
},{
  department: 'Finance',
  person: 'Peter'
},{
  department: 'HR',
  person: 'Jane'
}];
将人员按
部门进行分组并更改键

[{
  role: 'HR',
  people: ['Tom','Jane']
 },{
  role: 'Finance',
  people: ['Peter']
}]
我使用的这种技术似乎很流行,而且效果很好,我不确定它是否有名字

const data=[{部门:'HR',人员:'Tom'},{部门:'Finance',人员:'Peter'},{部门:'HR',人员:'Jane'}];
具有OBJ的功能组PeopleBy部门(数据){
常量obj={};
数据(部门、人员){
如果(!obj[部门]){
obj[部门]={角色:部门,人员:[]};
}
obj[部门].人.推(人);
}
返回Object.values(obj);
}
console.log(groupPeopleByDepartmentWithObj(数据))

.as控制台包装{max height:100%!important;top:0;}
对象属性和键值存储中的键之间存在根本区别

属性是您在编码时定义的,它有固定的名称和定义良好的含义。属性类似于变量或函数

键是只在运行时才知道的东西,它是动态的,除了与某些值关联外,没有任何固有的意义。键类似于数组索引

过去,javascript
Object
s被误用来模拟键值存储,使用属性名作为键。这有几个严重的缺点

  • 属性名和键只能是字符串
  • 属性通常不按顺序排列
  • 关键迭代很笨拙(
    hasOwnProperty
    etc)
  • 由于属性和键之间没有区别,动态键可能会意外地覆盖已定义的属性,反之亦然,现有属性可能会被误认为是键
Map
的发明就是为了解决这些缺点:

  • Map
    键可以是任何东西
  • Map
    键始终按插入顺序排列
  • 关键迭代定义良好
  • 键和属性位于单独的名称空间中,不会相互覆盖
因此,如果您需要键值存储,
Map
始终是更好的选择。为此使用泛型对象是一个错误

至于使用地图进行分组的“更好”方法,这是相当主观的。我想要一个更通用的版本

/// data: an Iterable
/// keyFn: a function which will be applied to each data item to obtain its group key
/// returns: a Map(key => [items])

// function groupBy<T, K>(data: Iterable<T>, keyFn: (x: T) => K): Map<K, T[]> 
//
function groupBy(data, keyFn) {
    let m = new Map();

    for (let x of data) {
        let k = keyFn(x);
        if (!m.has(k))
            m.set(k, []);
        m.get(k).push(x);
    }

    return m;
}

对象属性和键值存储中的键之间存在根本区别

属性是您在编码时定义的,它有固定的名称和定义良好的含义。属性类似于变量或函数

键是只在运行时才知道的东西,它是动态的,除了与某些值关联外,没有任何固有的意义。键类似于数组索引

过去,javascript
Object
s被误用来模拟键值存储,使用属性名作为键。这有几个严重的缺点

  • 属性名和键只能是字符串
  • 属性通常不按顺序排列
  • 关键迭代很笨拙(
    hasOwnProperty
    etc)
  • 由于属性和键之间没有区别,动态键可能会意外地覆盖已定义的属性,反之亦然,现有属性可能会被误认为是键
Map
的发明就是为了解决这些缺点:

  • Map
    键可以是任何东西
  • Map
    键始终按插入顺序排列
  • 关键迭代定义良好
  • 键和属性位于单独的名称空间中,不会相互覆盖
因此,如果您需要键值存储,
Map
始终是更好的选择。为此使用泛型对象是一个错误

至于使用地图进行分组的“更好”方法,这是相当主观的。我想要一个更通用的版本

/// data: an Iterable
/// keyFn: a function which will be applied to each data item to obtain its group key
/// returns: a Map(key => [items])

// function groupBy<T, K>(data: Iterable<T>, keyFn: (x: T) => K): Map<K, T[]> 
//
function groupBy(data, keyFn) {
    let m = new Map();

    for (let x of data) {
        let k = keyFn(x);
        if (!m.has(k))
            m.set(k, []);
        m.get(k).push(x);
    }

    return m;
}

当你说
这种方法更好吗
你是什么意思?您是否试图(可能过早地)优化代码的性能?或者你在寻找bug?也许这个问题更适合我的意思是,使用Map来完成这个任务有什么意义吗?你在征求意见,基于意见的问题不适合搜索。如果你有
部门的数值,则使用Map将保持原始顺序,而使用对象则不会(例如:如果将
部门
更改为
2
而不是
'HR'
1
而不是
'Finance'
,您将收到两份不同的订单)。如果
部门
持有对象类型,你也会在两者之间得到不同的结果。就速度而言,我听说使用地图更快,但我自己从未测试过,因为这样的东西的速度其实不值得担心。当你说
这种方法更好吗
你是什么意思?你想尝试吗(可能过早地)优化代码的性能?或者你在寻找bug吗?也许这个问题更适合我的意思是,使用Map来完成这个任务有什么意义吗?你在征求意见,基于意见的问题不适合搜索。如果你有
部门的数值,Map将保持原始顺序>,使用对象不会(例如:如果将
部门
更改为
2
而不是
'HR'
1
而不是
'Finance'
,您将获得两个不同的订单)。如果
部门
持有对象类型,你也会在两者之间得到不同的结果。就速度而言,我听说使用地图更快,但我自己从未测试过,因为这样的速度实在不值得担心。那么你是说第二个片段更适合这项任务吗?@lvaro:是的,我就是这么说的;)谢谢,关于另一个问题,有没有更好的方法使用
Map
?因为我只是在复制我对对象所做的操作。@阿尔瓦罗:见上图