我有一个json对象数组:
[ {id:0, name:'A'}, {id:1, name:'B'}...{id:n, name:'N'} ]
如何在不迭代数组的情况下获取基于给定id的值(名称)?也许使用地图或一些过滤方法...
答案 0 :(得分:2)
const arr = [ {id:0, name:'A'}, {id:1, name:'B'},{id:3, name:'N'} ];
const inputId = 1;
const foundObj = arr.find(({ id }) => id === inputId);
if (foundObj) console.log(foundObj.name);

这仍然会在内部迭代数组(但任何方法都会如此)。
答案 1 :(得分:1)
此find方法将根据您的对象属性和值查找对象。
ArrayName.find(x => x.id === 0);
答案 2 :(得分:1)
let array = [ {id:0, name:'A'}, {id:1, name:'B'}, {id:'n', name:'N'} ]
//To search in array we must iterate. But if you want to optimise performance for multiple searches you can map it to object by id.
let map = array.reduce((acc,element)=>{acc[element.id]=element;return acc;},{})
console.log(map[0])
console.log(map[1])
console.log(map.n) //As n was used as id.
答案 3 :(得分:1)
当你想在集合中找到一个元素时,数组可能不是最佳选择,在这种情况下,对象或地图会更好。
每次你必须找到一个元素时,你必须遍历数组,这需要花费O(n)时间。
为避免这种情况,您可以在中间放置一个API图层,将您的数组转换为一个数据结构,该结构通过唯一键映射值。您可以通过简单的Javascript对象实现此目的。
这样你就可以在O(1)中通过id找到你的元素而不需要任何迭代。
//original data
let arr = [ {id:0, name:'A'}, {id:1, name:'B'}, {id:2, name:'N'} ];
//convert it into object
let obj = arr.reduce((acc, curr) => {
acc[curr.id] = curr;
return acc;
}, {});
//modified data
{ 0: { id: 0, name: 'A' },
1: { id: 1, name: 'B' },
2: { id: 2, name: 'N' } }
//Now, you can look up value on any id as
obj[id].name;
答案 4 :(得分:1)
Maps
进行一次迭代构建。 Value retrieval thereon is sublinear.
// Input.
const input = [{id: 0, name:'A'}, {id: 1, name:'B'}, {id: 13, name:'N'}]
// To Map.
const toMap = (A) => new Map(A.map(x => [x.id, x]))
// Output.
const output = toMap(input)
// Proof.
console.log(output.get(0))
console.log(output.get(1))
console.log(output.get(13))