Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.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 - Fatal编程技术网

从javascript中包含下划线的对象数组返回所有键:值对

从javascript中包含下划线的对象数组返回所有键:值对,javascript,Javascript,我有一些行包含如下格式的数据: { id:"id", param:"street1", param:"street2", param_eu:"street", param_ru:"street", }, { id:"id2", param:"street1", param:"street2", param_fr:&quo

我有一些行包含如下格式的数据:

{
 id:"id",
 param:"street1",
 param:"street2",
 param_eu:"street",
 param_ru:"street",
},
{
 id:"id2",
 param:"street1",
 param:"street2",
 param_fr:"street",
 param_cz:"street",
},
{ 
 eu:"street",
 ru:"street"
},
{ 
 fr:"street",
 cz:"street"
},
我只想选择包含“_”且仅将国家/地区保留为关键字名称的配对,如下所示:

{
 id:"id",
 param:"street1",
 param:"street2",
 param_eu:"street",
 param_ru:"street",
},
{
 id:"id2",
 param:"street1",
 param:"street2",
 param_fr:"street",
 param_cz:"street",
},
{ 
 eu:"street",
 ru:"street"
},
{ 
 fr:"street",
 cz:"street"
},

设法用多个内部for循环完成了它,但这是巨大的。有更好的解决方案吗?

您可以迭代列表,每次都减少对象属性:
const数据=[
{id:“id”,param:“street1”,param:“street2”,param_eu:“street”,param_ru:“street”},
{id:“id2”,param:“street1”,param:“street2”,param_fr:“street”,param_cz:“street”}
];
//迭代对象
const res=数据减少((国家,项目)=>{
//减少对象属性
const itemWithCountries=Object.entries(项)
.reduce((acc,[键,值])=>{
if(key.includes(“”“))acc[key.split(“”“).pop()]=值;
返回acc;
}, {});
//减推力物体
if(Object.keys(itemWithCountries).length>0)countries.push(itemWithCountries);
返回国;
}, []);

控制台日志(res)您可以通过从对象中获取所有条目来映射新对象,获取所需的条目并从条目中将对象构建为新对象

const
数组=[{id:“id”,参数:“street1”,参数:“street2”,参数eu:“street”,参数ru:“street”},{id:“id2”,参数:“street1”,参数:“street2”,参数fr:“street”,参数cz:“street”},
结果=array.map(对象=>object.fromEntries(对象
.条目(对象)
.filter(([key])=>key.includes(“”)
));
控制台日志(结果)您可以首先在阵列上使用,将每个对象映射到新对象。新对象是使用、和
.map()
创建的。您可以按如下方式使用这些方法:

  • 使用
    Object.entries()
    从对象中获取
    [[key,value],…]
    对数组

  • 在上面的键值对数组中,使用
    .filter()
    通过检查
    键是否为下划线
    “quot

  • 过滤完数组后,在过滤的键值数组上使用
    .map()
    ,将每个内部数组(即:
    [key,value]
    )映射到一个新数组,在该数组中删除下划线左侧的所有内容。要做到这一点,您可以使用
    “quot
    键来形成一个由两部分组成的数组-
    “param”
    和alpha国家代码。您可以使用获取部件数组中的最后一个字符串(即:alpha国家代码)

  • 在调用
    Object.fromEntries()
    时,将此筛选/映射的键值对数组包装起来。由于这需要一个包含
    [[key,value],…]
    对的数组,因此它将能够为您构建一个对象,其中每个内部
    [key,value]
    数组将转换为结果对象中的
    {key:value,…}

  • 见下例:

    const arr=[{id:“id”,param:“street1”,param:“street2”,param_eu:“street”,param_ru:“street”,},{id:“id2”,param:“street1”,param:“street2”,param_fr:“street”,param_cz:“street”,}];
    常数res=arr.map(
    obj=>Object.fromEntries(
    Object.entries(obj.filter)(
    ([key])=>key.includes(“quo”)
    ).map(([key,val])=>[key.split(“”).pop(),val])
    )
    );
    
    控制台日志(res)向我们展示代码(您的尝试)熟悉并使用可用的和方法(静态和原型)。有人会告诉您使用
    reduce
    。别这样,这只是增加了复杂性。使用
    map
    并在回调中为in
    循环使用
    (或
    对象上的
    键使用
    map
    ),或在回调使用
    对象的地方使用
    映射。(在后者中,还需要另一个
    map
    来更改键值,因此循环可能更简单。)