我在数组中嵌套了数组,如何检查' s id?
[{
no: 1,
car: [{
id: 123,
name: 'abc'
},{
id: 456,
name: 'def',
checked: true
}]
}]
所以在这种情况下它是['456']
,但是如何使用es6并且不使用concact.apply或使用push方法的变异变量?
答案 0 :(得分:4)
您可以使用Array#filter
和Array#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
的经典用例
当我需要filter
和map
数组时,我立即尝试用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)
使用filter
和map
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)