我有一个具有以下结构的对象数组:
var arr = [
{
"value": "abc",
"checked": true
},
{
"value": "xyz",
"checked": false
},
{
"value": "lmn",
"checked": true
}
];
let result = arr.filter(item => item.checked);
console.log(result);
我希望输出为:
["abc", "lmn"]
因为这两个value
具有checked: true
。
我尝试根据检查的值进行过滤:
let result = arr.filter(item => item.checked);
我得到的对象的属性值设置为checked
。{p}
我们将不胜感激。
答案 0 :(得分:5)
您可以使用reduce
来检查checked
是否为真,然后将push
的值累加到累加器-不需要2个循环:
const arr = [{"value": "abc","checked": true},{"value": "xyz","checked": false},{"value": "lmn","checked": true}],
filtered = arr.reduce((a, o) => o.checked ? a.concat(o.value) : a, [])
console.log(filtered)
assoron指出,push
比concat
快,因此您可以按以下方式编写该函数:
const arr = [{"value": "abc","checked": true},{"value": "xyz","checked": false},{"value": "lmn","checked": true}],
filtered = arr.reduce((a, o) => {
if (o.checked) a.push(o.value)
return a
}, [])
console.log(filtered)
答案 1 :(得分:4)
首先,这不是有效的JS-您需要交换方括号和大括号。数组使用[]
,对象使用{}
,而不是相反。
第二,您应该首先根据filter
属性checked
淘汰想要的对象,然后使用map
提取所需的属性:
const arr =[{"value":"abc","checked":true},{"value":"xyz","checked":false},{"value":"lmn","checked":true}];
const res = arr.filter(({ checked }) => checked).map(({ value }) => value);
console.log(res);
答案 2 :(得分:4)
使用过滤器和地图:
const arr =[{"value":"abc","checked":true},{"value":"xyz","checked":false},{"value":"lmn","checked":true}];
const result = arr.filter(res=>res.checked).map(ele=>ele.value);
console.log(result);
答案 3 :(得分:4)
不要使事情复杂化。只需使用普通的for循环并保存运行时。即使数组中的所有元素都具有选中的属性true
,下面的语句也只会对数组进行一次迭代。
var arr = [{
"value": "abc",
"checked": true
}, {
"value": "xyz",
"checked": false
}, {
"value": "lmn",
"checked": true
}];
var results = [];
for(var i=0; i<arr.length-1; i++) {
if(arr[i].checked === true){
results.push(arr[i].value)
}
}
如果您研究.map
/ .filter
的内部实现,它们将使用while循环来迭代数组。假设如果您的数据中所有元素都设置为true,则filter将遍历所有元素,而map则会遍历所有元素以从中获取值。
答案 4 :(得分:3)
修复数据结构并使用过滤器和地图
var obj = [
{
"value" : "abc",
"checked" : true
},
{
"value" : "xyz",
"checked" : false
},
{
"value" : "lmn",
"checked" : true
}
]
console.log(obj.filter(function(e){return e.checked==true}).map(function(e){return e.value}))
答案 5 :(得分:3)
Array.prototype.reduce()
可能会对您有所帮助。 reduce()
回调有两个参数,第一个参数是旧的/先前的迭代值,第二个参数是当前的迭代值/元素。
因此,使用此函数,我们可以将当前迭代值保留为先前的迭代值(总值)。
reduce()方法在数组的每个元素上执行化简函数(由您提供),从而产生单个输出值。
var arr = [{"value": "abc","checked": true},{"value": "xyz","checked": false},{"value": "lmn","checked": true}]
const result = arr.reduce((acc, cur) => ((cur.checked && acc.push(cur.value)), acc), [])
console.log(result)
答案 6 :(得分:2)
使用地图和过滤器功能如下:
var arr = [ {
"value": "abc",
"checked": true
},
{
"value": "xyz",
"checked": false
},
{
"value": "lmn",
"checked": true
}]
let checkedValues = arr.map((item) => item.checked ? item.value : null).filter(item => item);
console.log(checkedValues);
答案 7 :(得分:2)
这里的所有解决方案都是有效的,但是,如果您更喜欢使用ES6 +语法的迭代方法,则可以在项目上显式地进行每个循环,以使您的意图对于读者来说更加清晰(此外,它比连接{{ 1}}和filter
,因为它们会循环遍历您的列表两次):
map
答案 8 :(得分:1)
基本上可以同时使用.reduce
和map
和filter
。下面,我使用[v].slice(+!c)
构建了一个累积数组,如果c
为true,它将把值添加到(累积)数组中,否则,它不会将它添加到数组中(因为[v].slice(+!false)
将返回[]
,而[...[]]
将给出[]
):
const arr = [{
"value": "abc",
"checked": true
}, {
"value": "xyz",
"checked": false
}, {
"value": "lmn",
"checked": true
}];
const res = arr.reduce((a, {value:v, checked:c}) => [...a, ...[v].slice(+!c)], []);
console.log(res);
答案 9 :(得分:1)
创建一个通用函数,您只需要传递键值和数组,它将过滤掉基于参数的基础
var arr = [
{
"value": "abc",
"checked": true
},
{
"value": "xyz",
"checked": false
},
{
"value": "lmn",
"checked": true
}
]
function filterList(keyValue, list) {
let filteredList = [];
for(let i = 0; i < list.length; i++) {
if(list[i]["checked"] === keyValue) {
filteredList.push(list[i]["value"]);
}
}
return filteredList;
}
console.log(filterList(true, arr));
答案 10 :(得分:0)
您没有将值推入新数组中。试试这个,它工作正常。
const arr = [{ "value": "abc", "checked": true }, { "value": "xyz", "checked": false }, { "value": "lmn", "checked": true }]
let result = []
let check = arr.filter((val) => {
if (val.checked) {
result.push(val.value)
}
})
console.log(result);
答案 11 :(得分:0)
var a = [];
arr.forEach( (i)=> i.checked ? a.push(i.value) :null )
它将评估为数组的每个元素传递给foreach的方法,并检查element.checked是否为true,它将把element.value推入所需输出的数组a中。