我尝试传递一个变量并将其用作文字属性来对我的数据进行排序,但是,当变量有多个$tblName="MyTable"
$searchFor="%something%"
"select * FROM $tblName LIMIT 10;
select * From $tblName where somecolumn like '$searchFor';
" | mysql
带点符号时,localeCompare错误{{1} }。
level
答案 0 :(得分:1)
因此,当使用括号表示法访问属性时,javascript将寻找那个确切的密钥。因此,通过说obj["name.first"]
,它会按字面意思查找该密钥,因此它会匹配{"name.first": "bob"}
,但不匹配{name: {first: "bob"}}
。
要获得所需的行为,您必须手动分离每个部分。因此,获取任意属性键的简单函数可能是:
function getKeyAt(obj, key) {
let result = obj;
for (const part of key.split(".")) {
if (!(part in result)) return; // If the key doesn't exist, return.
result = result[part];
}
return result;
}
或者,如果您有可用的lodash,它会为您提供一个方便的功能_.get
。
一旦你有了这样的功能,你的代码就可以这样修改:
handleTableSort = (sortByColumn) => (event) => {
event.preventDefault();
const sortByColumn = 'name.first';
const profileCandidates = this.state.profileCandidates.sort((a, b) => getKeyAt(a, sortByColumn).localeCompare(getKeyAt(b, sortByColumn));
this.setState({
profileCandidates: profileCandidates
})
}
答案 1 :(得分:0)
据我所知,没有本地方法可以做到这一点,但代码很简单:
const deref = (o, c) => {
const _deref = (o, l) => l.length? _deref(o[l[0]], l.slice(1)): o;
return _deref(o, c.split('.'));
};
...
const profileCandidates = this.state.profileCandidates.sort((a, b)
=> a[sortByColumn].localeCompare(deref(b, sortByColumn)));