带点符号的Literal属性返回undefined

时间:2018-01-03 00:03:59

标签: javascript reactjs

我尝试传递一个变量并将其用作文字属性来对我的数据进行排序,但是,当变量有多个$tblName="MyTable" $searchFor="%something%" "select * FROM $tblName LIMIT 10; select * From $tblName where somecolumn like '$searchFor'; " | mysql 带点符号时,localeCompare错误{{1} }。

level

2 个答案:

答案 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)));