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

v21*_*103 9 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);
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

["abc", "lmn"] 
Run Code Online (Sandbox Code Playgroud)

因为那两个value都有checked: true

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

let result = arr.filter(item => item.checked);
Run Code Online (Sandbox Code Playgroud)

我正在获取具有checked设置为的属性值的对象true

帮助将不胜感激。

Gho*_*med 8

使用过滤器和地图:

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);
Run Code Online (Sandbox Code Playgroud)


Kob*_*obe 7

您可以reduce检查是否checked为真,然后push使用累加器的值-不需要2个循环:

const arr = [{"value": "abc","checked": true},{"value": "xyz","checked": false},{"value": "lmn","checked": true}]
const filtered = arr.reduce((a, o) => o.checked ? a.concat(o.value) : a, [])
  
console.log(filtered)
Run Code Online (Sandbox Code Playgroud)

正如assoron所指出的那样push它比快concat,因此您可以按以下方式编写该函数:

const arr = [{"value": "abc","checked": true},{"value": "xyz","checked": false},{"value": "lmn","checked": true}]
const filtered = arr.reduce((a, o) => (o.checked && a.push(o.value), a), [])
  
console.log(filtered)
Run Code Online (Sandbox Code Playgroud)

  • @assoron是的,您是对的。我只写了concat,所以您可以将其写在一行上,以提高可读性。传播语法非常慢,我记得曾经写过一个JSPerf,而iirc却慢了50%。 (2认同)
  • 您可以使用`push`:`(a.push(o.value),a)`在一行中完成此操作。 (2认同)
  • 是的-逗号运算符评估所有传递的代码,然后使用最后一个。因此,运行a.push(o.value),然后将a用作表达式的返回值,然后从函数中返回。说得通? (2认同)

Jac*_*ord 5

首先,那不是有效的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);
Run Code Online (Sandbox Code Playgroud)