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

时间:2019-07-25 09:13:40

标签: javascript arrays object ecmascript-6

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

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}

我们将不胜感激。

12 个答案:

答案 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指出,pushconcat快,因此您可以按以下方式编写该函数:

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)

基本上可以同时使用.reducemapfilter。下面,我使用[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中。