在 JavaScript 中访问嵌套属性的更好方法
Better way to access nested attributes in JavaScript
我有这个函数,我想在其中从函数内部传递的参数访问嵌套属性。
var objectsArr = [
{nestedobj:{property:'1'}},
{nestedobj:{property:'3'}},
{nestedobj:{property:'2'}},
{nestedobj:{property:'4'}}
];
function sortObjectsArr(objectsArray) {
if (arguments.length == 2) {
objectsArray.sort((a,b) => a[arguments[1]] - b[arguments[1]]);
}
if (arguments.length == 3) {
objectsArray.sort((a,b) => a[arguments[1]][arguments[2]] - b[arguments[1]][arguments[2]]);
}
if (arguments.length == 4) {
objectsArray.sort((a,b) => a[arguments[1]][arguments[2]][arguments[3]] - b[arguments[1]][arguments[2]][arguments[3]]);
}
//and so on and so forth
}
sortObjectsArr(objectsArr, 'nestedobj', 'property');
console.log(objectsArr);
有没有更好的方法来访问对象的属性?而不是 [arguments[1]][arguments[2]][arguments[3]]....
?
所以我会先将其他args作为rest参数,而不是使用arguments数组。
然后我会定义一个小的辅助函数。
function sortObjectsArr(objectsArray, ...path) {
objectsArray.sort((a, b) => getFromPath(a, path) - getFromPath(b, path))
}
function getFromPath(obj, path) {
let r = obj;
path.forEach(key => { r = r[key]})
return r
}
let objectsArr = [
{nestedobj:{property:'1'}},
{nestedobj:{property:'3'}},
{nestedobj:{property:'2'}},
{nestedobj:{property:'4'}}
];
sortObjectsArr(objectsArr, 'nestedobj', 'property');
console.log(objectsArr);
最后:避免使用 var
,改用 let,它很旧而且行为怪异(以您意想不到的方式)。但是解释这超出了这个答案,你可以 google 它。
编辑:如果你想变得很酷,你可以使用 reduce 函数:
function getFromPath(obj, path) {
return path.reduce((o, key) => o[key], obj)
}
如果这更易读,您需要自己决定。
我有这个函数,我想在其中从函数内部传递的参数访问嵌套属性。
var objectsArr = [
{nestedobj:{property:'1'}},
{nestedobj:{property:'3'}},
{nestedobj:{property:'2'}},
{nestedobj:{property:'4'}}
];
function sortObjectsArr(objectsArray) {
if (arguments.length == 2) {
objectsArray.sort((a,b) => a[arguments[1]] - b[arguments[1]]);
}
if (arguments.length == 3) {
objectsArray.sort((a,b) => a[arguments[1]][arguments[2]] - b[arguments[1]][arguments[2]]);
}
if (arguments.length == 4) {
objectsArray.sort((a,b) => a[arguments[1]][arguments[2]][arguments[3]] - b[arguments[1]][arguments[2]][arguments[3]]);
}
//and so on and so forth
}
sortObjectsArr(objectsArr, 'nestedobj', 'property');
console.log(objectsArr);
有没有更好的方法来访问对象的属性?而不是 [arguments[1]][arguments[2]][arguments[3]]....
?
所以我会先将其他args作为rest参数,而不是使用arguments数组。 然后我会定义一个小的辅助函数。
function sortObjectsArr(objectsArray, ...path) {
objectsArray.sort((a, b) => getFromPath(a, path) - getFromPath(b, path))
}
function getFromPath(obj, path) {
let r = obj;
path.forEach(key => { r = r[key]})
return r
}
let objectsArr = [
{nestedobj:{property:'1'}},
{nestedobj:{property:'3'}},
{nestedobj:{property:'2'}},
{nestedobj:{property:'4'}}
];
sortObjectsArr(objectsArr, 'nestedobj', 'property');
console.log(objectsArr);
最后:避免使用 var
,改用 let,它很旧而且行为怪异(以您意想不到的方式)。但是解释这超出了这个答案,你可以 google 它。
编辑:如果你想变得很酷,你可以使用 reduce 函数:
function getFromPath(obj, path) {
return path.reduce((o, key) => o[key], obj)
}
如果这更易读,您需要自己决定。