根据值从对象数组中选择属性: Javascript

共12个回答,已解决, 标签: javascript arrays object ecmascript-6

我有一个具有以下结构的对象数组:

Arr = [
{
"值": "abc",
“已检查”: true
},
{
"值": "xyz",
【已检查】: 假
},
{
“值”: “lmn”,
“已检查”: true
}
];

让结果 = arr.filter (item => item.checked);

控制台日志 (结果);

我希望输出是:

【 “Abc” “lmn” 】

因为那两个values have checked: true

我已经尝试根据检查的值过滤掉:

让结果 = arr.filter (item => item.checked);

我得到的对象checked property value that is set to true

我们将感谢您的帮助。

第1个答案(采用)

你可以用reduce with a check if checked is true, then push累加器的值-不需要两个循环:

Const arr = [{"value": "abc","check": true},{"value": "xyz","check": false},{"value “lmn”,“已检查”: true}],
Filtered = arr.reduce (a,o) => o.已检查?A.concat (o.value): a.[])

正如所指出的Assoron,push is faster than concat,因此您可以按以下方式编写该函数:

Const arr = [{"value": "abc","check": true},{"value": "xyz","check": false},{"value “lmn”,“已检查”: true}],
Filtered = arr.reduce (a,o) => {
如果 (检查) a.push (o.value)
返回 a
},[])

第2个答案

首先,这不是有效的 JS -- 你需要交换你的括号和括号。数组使用[], and objects use {},而不是相反。

其次,你应该先filter out the wanted objects based on the checked property, then use map要提取您想要的属性:

Const arr = [{"value": "abc","check": true},{"value": "xyz","check": false},{"value “lmn”,“已检查”: true}];

Filter res = arr.filter ({已检查} => 已检查).map (({value}) => value);
第3个答案

使用过滤器和地图:

Const arr = [{"value": "abc","check": true},{"value": "xyz","check": false},{"value “lmn”,“已检查”: true}];

过滤器 (res => res.Check).map (ele => ele.value);
第4个答案

不要把事情搞复杂。只需使用普通 for 循环并保存运行时即可。即使数组中的所有元素都具有检查属性,以下将仅迭代数组一次true

Var arr = [{
"值": "abc",
“已检查”: true
},{
"值": "xyz",
【已检查】: 假
},{
“值”: “lmn”,
“已检查”: true
}];

如果你研究一下这个内部实现.map/.filter他们将使用循环迭代数组。比如说,如果你有一个数据,所有元素都被设置为检查为 true, 然后 filter 将一次又一次地迭代所有元素,map 将迭代它们以从中获取值。

第5个答案

修复数据结构,使用 filter 和 map

Var obj = [
{
"值": "abc",
“已检查”: true
},
{
"值": "xyz",
【已检查】: 假
},
{
“值”: “lmn”,
“已检查”: true
}
]
控制台.log (obj.filter (函数 (e) {return e.checked = = true}).map (函数 (e) {return e.value})
第6个答案

Array.prototype.reduce() might help you. reduce()Callback 接受两个参数,第一个参数是旧的/上一个迭代值,第二个参数是当前的迭代值/元素。

因此,使用这个函数,我们可以将当前迭代值保存到上一个迭代值 (总价值)。

减少 ()方法在数组的每个元素上执行 reducer 函数 (您提供的函数),从而产生单个输出值。

Var arr = [{“值”: “abc”,“检查”: true},{“值”: “xyz”,“检查”: false},{“值 “lmn”,“已检查”: true}]

第7个答案

使用 map 和 filter 功能如下:

Var arr = [{
"值": "abc",
“已检查”: true
},
{
"值": "xyz",
【已检查】: 假
},
{
“值”: “lmn”,
“已检查”: true
}]


让 check-values = arr.map ((item) => item.Check?Item.value: null).filter (item => item);
第8个答案

这里的所有解决方案都是有效的但是,如果你更喜欢使用 ES6 语法的迭代方法,你可以显式地在你的项目上进行每个循环,以便让你的意图对你的读者来说非常清楚filter and map,因为它会在你的列表上循环两次):

康斯特项目 = [
{
"值": "abc",
“已检查”: true
},
{
"值": "xyz",
【已检查】: 假
},
{
“值”: “lmn”,
“已检查”: true
}
];

Const 格式化列表项目 = [];
(物品的项目) {
如果 (已检查的项目)
推送 (item.value);
}
第9个答案

创建一个通用函数,在该函数中,您只需要传递键值和数组,它将在参数的基础上过滤掉 arry

Arr = [
{
"值": "abc",
“已检查”: true
},
{
"值": "xyz",
【已检查】: 假
},
{
“值”: “lmn”,
“已检查”: true
}
]


函数过滤列表 (keyValue,list) {
让 filteredList = [];
(设 i = 0; i <list.length; i) {
如果 (列表 [i] [“已检查”] = 键值) {
FilteredList.push (列表 [i] [“值”);
}
}
返回筛选列表;
}

控制台日志 (filterList (true,arr));
第10个答案

你可以用.reduce to essentially map and filter at the same time. Below I have built an accumulated array using [v].slice( !c)] which will add the value to the (accumulated) array if c is true, else, it will not add it to the array (as [v].slice( !false)] will return [], and [...[]] will give []):

Const arr = [{
"值": "abc",
“已检查”: true
},{
"值": "xyz",
【已检查】: 假
},{
“值”: “lmn”,
“已检查”: true
}];

第11个答案
康斯特专业 = [
{“值”: “abc”,“已检查”: true},
{“值”: “xyz”,“已检查”: false},
{“值”: “lmn”,“已检查”: true}
];

Filter nxt = pro.filter ({已检查} => 已检查).map (({value}) => value);

控制台日志 (nxt);
第12个答案

您没有在新数组中推送值。试试这个,它工作正常。

Const arr = [{“值”: “abc”,“检查”: true},{“值”: “xyz”,“检查”: false}, {“值”: “lmn”,“已检查”: true}]
让结果 = []
过滤器 (val) => {
如果 (val.checked) {
结果.push (val.value)
}
})
控制台日志 (结果);

相关问题

如何从异步调用返回响应? 循环中的 JavaScript 闭包--简单的实际示例 如何从异步调用返回响应? "注意: 未定义的变量"、"注意: 未定义的索引" 和 "注意: 未定义的偏移量" 使用 PHP 删除数字数组中的所有重复数字 [重复] 使用数组中的键获取最小值 根据值从对象数组中选择属性: Javascript 将对象数组转换为对象 在 Javascript 中合并两个对象数组 如何在解构的同时将字符串解析为数字?