Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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 将对象数组转换为以分组键作为数组的对象的简单方法_Javascript_Typescript_Lodash - Fatal编程技术网

Javascript 将对象数组转换为以分组键作为数组的对象的简单方法

Javascript 将对象数组转换为以分组键作为数组的对象的简单方法,javascript,typescript,lodash,Javascript,Typescript,Lodash,我正在寻找一个简单的方法来做以下事情。我试着用lodash.reduce做这个,但它很笨重,有没有更简单的方法 发件人: 致: 我在typescript和lodash.reduce方面遇到了一些问题,这很有效 export function getFuncsObject(funcs): Record<Funcs, Case[]> { let f = { ...funcs }; f = lodash.mapValues(f, () => []); return f;

我正在寻找一个简单的方法来做以下事情。我试着用lodash.reduce做这个,但它很笨重,有没有更简单的方法

发件人:

致:


我在typescript和lodash.reduce方面遇到了一些问题,这很有效

export function getFuncsObject(funcs): Record<Funcs, Case[]> {
  let f = { ...funcs };
  f = lodash.mapValues(f, () => []);
  return f;
}

export function mockMerge(funcs, mocks: Record<Funcs, Case | null>[]): Record<Funcs, Case[]> {
  const f = getFuncsObject(funcs);
  lodash.each(mocks, (v, k) => {
    f[k].push(v);
  });
  return f;
}

您可以使用纯JS实现这一点,而不需要loadash

在输入数组上调用数组的reduce方法,并将数组缩减为一个对象,在内部对象的键上循环:

const input=[{a:'meow'},{a:'woof'},{b:'hi'},{a:'dog',c:'bye'},{}]; console.loginput.reduceac,val=>{ Object.keysval.forEachkey=>{ 如果!acc[键]{ acc[键]=[]; } acc[key].pushval[key]; }; 返回acc;
}, {}; 一种选择是使用以下两种削减:

常量输入=[{ “喵喵” }, { a:‘汪’ }, { b:‘呜’ }]; 常量结果=输入 .reduceitemResult,项=>Object.keysitem .reducekeyResult,键=>{ …关键结果, [关键点]:关键结果[关键点]| |[]。具体项目[关键点] },itemResult,{}; console.logresult您可以使用它将所有属性及其各自的值分配到一个对象中,并使用一个自定义函数来确定您想要如何构造该对象

const result = _.assignWith({}, ...data, (v = [], s) => v.concat(s));
注意:为了确保不改变数据数组中的任何对象,我传递了一个空对象作为第一个参数作为目标对象

常数数据=[ {a:'喵'}, {a'woof',k'hey'}, {k:'哟',d:'呵呵'}, {d:'wazup',q:'ohoho'} ]; const result=.{},…数据赋值,v=[],s=>v.concats; console.logresult;
不使用任何外部库或reduce

const input=[{a:'meow'},{a:'woof'},{b:'hi'},{a:'dog',c:'bye'},{}]; 让输出={}; input.forEachinputObj=>{ 输入框中的forlet键{ if!输出[键]{ 输出[键]=[]; } 输出[键].PushInputBJ[键] } };
console.logoutput;我向输入集中添加了更多的对象,只是为了说明这在广义集上是有效的+1.如果不喜欢此更改,可以回滚。我很抱歉,在这种情况下,u.mergeWith也可以用于相同的情况。OP的情况不处理递归赋值,那么我只是选择使用lodashassignWithCare来分担工作?您代表的用户应该知道它的重要性
export function getFuncsObject(funcs): Record<Funcs, Case[]> {
  let f = { ...funcs };
  f = lodash.mapValues(f, () => []);
  return f;
}

export function mockMerge(funcs, mocks: Record<Funcs, Case | null>[]): Record<Funcs, Case[]> {
  const f = getFuncsObject(funcs);
  lodash.each(mocks, (v, k) => {
    f[k].push(v);
  });
  return f;
}
const result = _.assignWith({}, ...data, (v = [], s) => v.concat(s));