构建此对象的最佳函数式语法?
Best functional-style syntax to build this object?
下面的代码实现了预期的输出。有没有更优雅的方法来做到这一点?
例如,是否有一些本机 javascript 函数(如 flatMap
等)可以提供帮助?
(我知道我可以去掉中间变量pieces
)。
const config = {
fieldName1: {
validation: "schema1",
value: "abcvalue here"
},
fieldName2: {
validation: "schema2",
value: "abcvalue here"
},
}
// Desired output:
// {
// fieldName1: "schema1",
// fieldName2: "schema2",
// ...
// }
const extractValidation = (config) => {
const pieces = Object.entries(config).map(
([key, val]) => ({
[key]: val.validation
})
)
return Object.assign({}, ...pieces)
}
extractValidation(config)
将 fromEntries
与 .entries
上的地图配对更简洁,我认为更漂亮。
const config = {
fieldName1: {
validation: "schema1",
value: "abcvalue here"
},
fieldName2: {
validation: "schema2",
value: "abcvalue here"
},
}
const extractValidation = (config) => Object.fromEntries(
Object.entries(config).map(([k,v]) => [k, v.validation])
);
console.log(extractValidation(config))
另一种方法是使用 reduce
,这样您就可以跳过 Object.assign
:
Object.entries(config).reduce((o, [k, v]) => (o[k] = v.validation, o), {})
//=> {fieldName1: 'schema1', fieldName2: 'schema2'}
这就是我要做的。
通过利用 Ramda,您可以无点并使用 map
到任何 Functor
const fn = R.map(R.prop('validation'));
const data = {
fieldName1: {
validation: "schema1",
value: "abcvalue here"
},
fieldName2: {
validation: "schema2",
value: "abcvalue here"
},
};
console.log(
fn(data),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.js" integrity="sha512-ZZcBsXW4OcbCTfDlXbzGCamH1cANkg6EfZAN2ukOl7s5q8skbB+WndmAqFT8fuMzeuHkceqd5UbIDn7fcqJFgg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
下面的代码实现了预期的输出。有没有更优雅的方法来做到这一点?
例如,是否有一些本机 javascript 函数(如 flatMap
等)可以提供帮助?
(我知道我可以去掉中间变量pieces
)。
const config = {
fieldName1: {
validation: "schema1",
value: "abcvalue here"
},
fieldName2: {
validation: "schema2",
value: "abcvalue here"
},
}
// Desired output:
// {
// fieldName1: "schema1",
// fieldName2: "schema2",
// ...
// }
const extractValidation = (config) => {
const pieces = Object.entries(config).map(
([key, val]) => ({
[key]: val.validation
})
)
return Object.assign({}, ...pieces)
}
extractValidation(config)
将 fromEntries
与 .entries
上的地图配对更简洁,我认为更漂亮。
const config = {
fieldName1: {
validation: "schema1",
value: "abcvalue here"
},
fieldName2: {
validation: "schema2",
value: "abcvalue here"
},
}
const extractValidation = (config) => Object.fromEntries(
Object.entries(config).map(([k,v]) => [k, v.validation])
);
console.log(extractValidation(config))
另一种方法是使用 reduce
,这样您就可以跳过 Object.assign
:
Object.entries(config).reduce((o, [k, v]) => (o[k] = v.validation, o), {})
//=> {fieldName1: 'schema1', fieldName2: 'schema2'}
这就是我要做的。
通过利用 Ramda,您可以无点并使用 map
到任何 Functor
const fn = R.map(R.prop('validation'));
const data = {
fieldName1: {
validation: "schema1",
value: "abcvalue here"
},
fieldName2: {
validation: "schema2",
value: "abcvalue here"
},
};
console.log(
fn(data),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.js" integrity="sha512-ZZcBsXW4OcbCTfDlXbzGCamH1cANkg6EfZAN2ukOl7s5q8skbB+WndmAqFT8fuMzeuHkceqd5UbIDn7fcqJFgg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>