我希望这可以加快速度并适用于您想要的。
编辑:我已经测试过这个问题。这没有树的深度限制,并且具有良好的性能影响。
/* set mode = 0 for root object retval,
set mode = 1 for first object retval,
otherwise for last object retval
eg. mode2 : for key = "aa.town" and value = "Edinburgh" will return { town: "Edinburgh" }, and so on.
eg. mode1 : for key = "bb.gen.OO7" and value = "Gen 7" will return { bb: { gen: { OO7: "Gen 7" } } }, and so on.
*/
export function getObject(array, key, value, mode = 1) {
if (typeof key !== "string" || key.trim() === "") return;
const gen7 = (_a, _key) => { return _a[_key] };
const getItem= (_object, _keys) => {
let i = 0, n = _keys.length-1, stack = _object;
while (i < n && (stack = gen7(stack, _keys[i++])) !== undefined);
return stack;
};
let keys = key.split("."),
first = keys[0],
last = keys[keys.length-1],
i = 0, len = array.length, obj;
while (i < len && ((obj = getItem(array[i], keys)) === undefined || obj[last] !== value)) i++;
if (i < len) return mode === 0 ? array[i] : mode === 1 ? array[i][first] : obj;
}
const people = [
{
a: 'Jim',
b: 'male',
c: '1971',
aa: {
town: 'London',
},
bb: {
gen: {
OO7: 'Gen 7'
}
}
},
{
a: 'Bob',
b: 'male',
c: '1971',
aa: {
town: 'Edinburgh',
},
}
];