我正在努力处理存储在具有我想要返回所有索引的对象的数组中的对象中的数组。
生成对象的函数如下:
const addArray = function(a, b) {
const object = {
name: a,
rooms: b
};
testArray.push(object);
};
我想要实现的是循环遍历"testArray"并返回数组Rooms包含"Office"例如,
我已经尝试过使用这样的函数,但我似乎无法为对象中的数组获得正确的语法:
function getAllIndexes(arr, val) {
var indexes = [], i = -1;
while ((i = arr.rooms.indexOf(val, i+1)) != -1){
indexes.push(i);
}
return indexes;
};
提前感谢!
编辑:数据的附加信息:
一个填充了数据的对象看起来像这样:
const device = {
name: "TV",
rooms: ["Living Room", "Bedroom"]
};
在生成这样的对象之后,我将它们推送到一个只包含这些对象的数组中(参见function addArray
)
您可以使用Array.flatMap()
将匹配val
的数组的每个值映射到它的索引,其余的映射到空数组,这将被flatMap:
删除
const getAllIndexes =(arr, val) => arr.flatMap((v, i) => v === val ? i : [])
const arr = [1, 2, 3, 1, 2, 1, 1, 2]
const result = getAllIndexes(arr, 1)
console.log(result)
使用对象数组,您需要比较值,或者检查对象是否满足某些条件。在这种情况下,最好将val
替换为谓词函数:
const getAllIndexes =(arr, pred) => arr.flatMap((v, i) => pred(v) ? i : [])
const arr = [{ rooms: [1, 2, 3] }, { rooms: [2, 1, 1] }, { rooms: [3, 2, 2] }, { rooms: [1, 2, 1] }]
const result = getAllIndexes(arr, o => o.rooms.includes(1))
console.log(result)
尝试使用Array.prototype.map和Array.prototype.filter
function getAllIndexes(arr, val) {
return arr.map(i=> {
let room = i.rooms;
return room.indexOf(val);
}).filter(a=>{
a != -1;
});
};
如果找到想要的值,您可以从设备中解构rooms
并获得索引。
const
room = 'Office',
indices = array.flatMap(({ rooms }, i) => rooms.includes(room) ? i : []);
以上代码的特点是我以前破解Array#flatMap
的解决方案。