gpt4 book ai didi

javascript - 如何将对象数组中的 "expand"子数组

转载 作者:搜寻专家 更新时间:2023-11-01 04:43:09 24 4
gpt4 key购买 nike

这是我的对象数组

[{
"key1": "value1",
"key2": "value2",
"key3": ["value3", "value4"]
}]

结果应该是这样的

[{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}, {
"key1": "value1",
"key2": "value2",
"key3": "value4"
}]

所以我想摆脱属性 key3 中的子数组并获得新的等效结构,复制所有其他属性。

由于我无法更改的原因,我应该使用 lodash,但仅限于 2.4.2 版本

编辑:更详细地说:我正在使用基于 JSON 的表单引擎,它允许使用现有函数(如 lodash 函数)但不允许定义新函数。我也不能使用 for 循环之类的控制结构。本质上,我只能使用链式基本函数调用,包括 lodash。

我试过用map,但是map不能扩展一个数组,它只能把一个数组元素转换成不同的东西

我可以在这里使用任何 lodash 魔法吗?

EDIT2:这是一个例子,说明我说“我不能引入新功能”时的意思。它将检查对象数组对于特定属性子集是否是唯一的

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

最佳答案

嗯,这是一个挑战!我有一个可行的解决方案,涵盖了我能想到的所有情况,但如果我遗漏了任何情况,请告诉我。


我的一般方法从头开始,我知道我将使用 _.zipObject 来创建结果对象。从那里开始,只需使其他属性与必要的 key3 值对齐即可。为此,我只需复制属性值,以便 key3 的每个值都有自己的副本。接下来,我将它们链接起来并创建对象。最后,我过滤掉所有不必要的对象副本。

注意:对于 key3 中的 undefined 元素,此方法将无法正常工作。我认为这种情况不太可能发生,因此没有尝试解决。


可理解的版本:

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");

全部在一行中:

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");

性能:

我预计它对于一个大的初始数组或一个大长度的 key3 来说会很糟糕。我尤其对单行版本不寒而栗。如果有人提示,我会指出这是由执行环境的限制引起的。


这是通过 https://npm.runkit.com/lodash 在浏览器中测试的, 使用 var _ = require('lodash@2.4.2');

关于javascript - 如何将对象数组中的 "expand"子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51989274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com