这是我的对象数组
[{
"key1": "value1",
"key2": "value2",
"key3": ["value3", "value4"]
}]
Run Code Online (Sandbox Code Playgroud)
结果应该是这样的
[{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}, {
"key1": "value1",
"key2": "value2",
"key3": "value4"
}]
Run Code Online (Sandbox Code Playgroud)
所以我想摆脱属性中的子数组key3并获得新的等效结构,复制所有其他属性.
由于我无法改变的原因,我应该使用lodash,但仅限于版本2.4.2
编辑:更详细:我使用基于JSON的表单引擎,允许使用现有的函数(如lodash函数),但不允许定义新的函数.我也不能使用像for循环这样的控制结构.基本上我只能使用链接的基本函数调用,包括lodash.
我试图使用map,但是map不能扩展数组,它只能将一个数组元素转换成不同的数组
我可以在这里使用任何lodash魔法吗?
编辑2:这是一个关于我说"我不能介绍新功能"的意思的例子.它将检查对象数组是否对于某个属性子集是唯一的
model = [{
"key1": "value1",
"key2": "value2",
"key3": "valuex"
},{
"key1": "value1",
"key2": "value2",
"key3": "valuey"
}]
// will give false because the two objects are not unique regarding the combination of "key1" and "key2"
_.uniq(model.map(_.partialRight(_.pick, ["key1", "key2"])).map(JSON.stringify)).length === model.length
Run Code Online (Sandbox Code Playgroud)
嗯,这是一个挑战!我有一个可行的解决方案,涵盖了我能想到的所有情况,但如果有我错过的情况,请告诉我。
我的一般方法从最后开始,我知道我将用来_.zipObject创建结果对象。从那里开始,只需使其他属性与必要的key3值保持一致即可。为此,我只需复制属性值,以便每个值key3都有自己的副本。接下来,我将它们链接起来并创建对象。最后,我过滤掉任何不必要的对象副本。
undefined注意:此方法对于中的元素无法正常工作key3。我认为这种情况不太可能发生,因此没有尝试解决。
可以理解的版本:
const objects = [{
"key1": "value1",
"key2": "value2",
"key3": ["value3", "value4"]
},
{
"key1": "value5",
"key2": "value6",
"key3": ["value7"]
}];
// Get other key names
const otherKeys = _.without(_.keys(objects[0]), "key3");
// Get values without key3
const otherValues = _.map(_.map(objects, _.partialRight(_.omit, "key3")), _.values);
// Get just key3 values
const onlyKey3 = _.map(objects, "key3");
// Generate dummy range of needed length
const maxLengthKey3 = _.max(_.map(onlyKey3, "length"));
const dummyRange = _.range(maxLengthKey3);
// Grow all arrays to needed length
const newOtherValues = _.flatten(_.map(dummyRange, _.partial(_.identity, otherValues)), true);
const newKey3 = _.flatten(_.map(dummyRange, _.partial(_.map, onlyKey3)));
const pairedValues = _.map(_.zip(newOtherValues, newKey3), _.flatten);
const resultObjects = _.map(pairedValues, _.partial(_.zipObject, _.union(otherKeys, ["key3"])));
// Filter out unnecessary objects
const result = _.filter(resultObjects, "key3");
Run Code Online (Sandbox Code Playgroud)
全部在一行:
const objects = [{
"key1": "value1",
"key2": "value2",
"key3": ["value3", "value4"]
},
{
"key1": "value5",
"key2": "value6",
"key3": ["value7"]
}];
// One line
const result = _.filter(_.map(_.map(_.zip(_.flatten(_.map(_.range(_.max(_.map(_.map(objects, "key3"), "length"))), _.partial(_.identity, _.map(_.map(objects, _.partialRight(_.omit, "key3")), _.values))), true), _.flatten(_.map(_.range(_.max(_.map(_.map(objects, "key3"), "length"))), _.partial(_.map, _.map(objects, "key3"))))), _.flatten), _.partial(_.zipObject, _.union(_.without(_.keys(objects[0]), "key3"), ["key3"]))), "key3");
Run Code Online (Sandbox Code Playgroud)
表现:
我预计它对于大型初始数组或大型 length 来说会很糟糕key3。我尤其对单行版本感到不寒而栗。如果有人抱怨,我会指出这是由执行环境的限制造成的。
这是通过https://npm.runkit.com/lodash在浏览器中进行测试的,使用var _ = require('lodash@2.4.2');
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |