在嵌套属性中收集数组而不使用concat apply

时间:2018-01-26 05:10:44

标签: javascript ecmascript-6

我在数组中嵌套了数组,如何检查' s id?

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

所以在这种情况下它是['456'],但是如何使用es6并且不使用concact.apply或使用push方法的变异变量?

4 个答案:

答案 0 :(得分:4)

您可以使用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), [])
)




答案 1 :(得分:0)

您可以使用Array.map()获取一系列汽车,Array.filter()获取已检查的汽车,然后映射到const data = [{"no":1,"car":[{"id":123,"name":"abc"},{"id":456,"name":"def","checked":true}]}] const result = [].concat(...data .map((o) => o.car .filter(o => o.checked) .map(o => o.id))) console.log(result),以获得结果。当前结果是一个数组数组。

要在ES6中展平结果,您可以扩展到concat,而不是应用它。

DECLARE @columnName varchar(25)
DECLARE @cursor CURSOR
DECLARE @sql nvarchar(1000)
DECLARE @tableName as nvarchar(30)
DECLARE @PartNo as nvarchar(30)
DECLARE @value as integer

set @PartNo = 'partnumber'
set @tableName = 'sometable'

SET @cursor = CURSOR FOR 
                  SELECT c.name 
                  FROM sys.columns c 
                  INNER JOIN sys.tables t ON c.object_id = t.object_id 
                  WHERE c.object_id = (SELECT object_id FROM sys.tables 
                                       WHERE name  = @tableName)
                    AND c.name NOT IN ('something')

OPEN @cursor

FETCH NEXT FROM @cursor INTO @columnName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = 'select sum('+@columnName+') from checktime where partNo = '''+@PartNo+''''

    EXEC sp_executesql @sql, N'@columnName varchar(25), @PartNo nvarchar(30), @value int OUTPUT',
                   @columnName,
                   @PartNo,
                   @value OUTPUT

    FETCH NEXT FROM @cursor INTO @columnName
END

CLOSE @cursor
DEALLOCATE @cursor

答案 2 :(得分:0)

在我看来,这是.reduce的经典用例 当我需要filtermap数组时,我立即尝试用reduce来做,所以我可以减少我需要对数组做的循环次数。

使用reduce,您可以有条件push accumulator对象(这就像进行过滤一样)
当你推动它时,你可以决定要推动的对象的形状(这就像做映射一样)。

在这种情况下使用push是可以的,因为您正在改变本地数组而不是外部数组。

以下是此类用例的示例:

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

const nextData = data.reduce((result, current) => {
    const flatten = current.car.reduce((r,c) => {
      if(c.checked){ // filter
        r.push(c.id); // map
      }
      return r;
    },[]);
    result.push(...flatten);
    return result;
  }, [])

console.log(nextData);

答案 3 :(得分:-1)

使用filtermap

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

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