javascript - 不使用 concat apply 收集嵌套属性中的数组

标签 javascript ecmascript-6

我在数组中嵌套了数组,如何获取选中的 id?

[{
    no: 1,
    car: [{
        id: 123,
        name: 'abc'
    },{
        id: 456,
        name: 'def',
       checked: true
    }]
}]

所以在本例中它是['456'],但是如何使用 es6 来做到这一点而不使用 concact.apply 或使用推送方法改变变量?

最佳答案

您可以使用 Array#filterArray#map 方法。

var data = [{
  no: 1,
  car: [{
    id: 123,
    name: 'abc'
  }, {
    id: 456,
    name: 'def',
    checked: true
  }]
}];


console.log(
  data[0].car.filter(o => o.checked).map(o => o.id)
)

更新 1:使用 Array#reduce 方法的多个元素的通用解决方案。

var data = [{
  no: 1,
  car: [{
    id: 123,
    name: 'abc'
  }, {
    id: 456,
    name: 'def',
    checked: true
  }]
}, {
  no: 1,
  car: [{
    id: 123,
    name: 'abc'
  }, {
    id: 345,
    checked: true
  }]
}];


console.log(
  data.reduce((arr, d) => {
    [].push.apply(arr, d.car.filter(o => o.checked).map(o => o.id));
    return arr;
  }, [])
)

更新2:您可以通过使用Array#push来避免spread syntax方法,但我认为这不是一种优雅的方式。

var data = [{
  no: 1,
  car: [{
    id: 123,
    name: 'abc'
  }, {
    id: 456,
    name: 'def',
    checked: true
  }]
}, {
  no: 1,
  car: [{
    id: 123,
    name: 'abc'
  }, {
    id: 345,
    checked: true
  }]
}];


console.log(
  data.reduce((arr, d) => [...arr, ...d.car.filter(o => o.checked).map(o => o.id)], [])
)

// or with spread with push, which would be better alternative
console.log(
  data.reduce((arr, d) => (arr.push(...d.car.filter(o => o.checked).map(o => o.id)), arr), [])
)

关于javascript - 不使用 concat apply 收集嵌套属性中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48456094/

相关文章:

javascript - 为对象计算的 polymer

javascript - ECMAScript 6 中的原型(prototype)链

javascript - "type"是 JavaScript 中的关键字吗?

javascript - 源代码和演示的组织

javascript - 发送消息到 console.log (jest puppeteer)

javascript - 深度冷冻任何类型

php - jQuery 事件目标元素属性检索

javascript - 在 ReactJS 中,我的代码是否有支持实例,因此可以使用引用?

javascript - 扩展 Error 对象时是否需要 super(originalError)?

Javascript 公共(public)方法参数作为私有(private)变量