Javascript 在单个JSON键中存储和检索字符串列表的最佳实践?

Javascript 在单个JSON键中存储和检索字符串列表的最佳实践?,javascript,arrays,json,Javascript,Arrays,Json,我想确定将简单列表存储和检索到单个JSON键中的最佳实践 假设我有5个朋友: bob, joe, peter, susan, & tiffany 假设我有一个更大的JSON集合,如下所示: { "title":"my title", "description":"my description about this collection" } { "title":"my title", "description":"my description abou

我想确定将简单列表存储和检索到单个JSON键中的最佳实践

假设我有5个朋友:

bob, joe, peter, susan, & tiffany
假设我有一个更大的JSON集合,如下所示:

{
    "title":"my title",
    "description":"my description about this collection"
}
{
    "title":"my title",
    "description":"my description about this collection"
    "friends":[
        "bob",
        "joe",
        "peter",
        "susan",
        "tiffany"
    ]
}
现在,如果我想在“friends”键下将此好友列表添加到我的收藏中,我可能会这样构造它:

{
    "title":"my title",
    "description":"my description about this collection"
}
{
    "title":"my title",
    "description":"my description about this collection"
    "friends":[
        "bob",
        "joe",
        "peter",
        "susan",
        "tiffany"
    ]
}
我用这种方式所面临的最大挑战之一是无法使用某些内置javascript或php数组函数

另一方面,在一个key:value成对数组中存储数量未知的对象也同样难以管理


如果有人能解释用JSON存储字符串列表的最佳方法,我将不胜感激。有没有更简单的方法来搜索和访问阵列数据?

下面的方法应该可以很好地工作:

function checkIfFriends(json, friend) {
    return json.friends.indexOf(friend) !== -1;
}
您也可以轻松实现其他搜索功能:

function findFriendsOf(people, friend) {
    var found = [];
    for(var i = 0; i < people.length; i++) {
        if(people[i].indexOf(friend) !== -1) {
            found.push(people[i]);
        }
    }
    return found;
}
函数findFriendsOf(人,朋友){
发现的var=[];
for(var i=0;i

通常,存储单类型对象列表的最佳方式是将其作为数组。这是人们通常希望它被存储为的内容,并且当他们必须维护它时,会使其他人的生活更轻松。

除非有充分的理由这样做,否则以最规范的格式存储它。在这种情况下,我认为数组/列表是最合适的。这是一个同质的名字集合

就语言支持而言,学习它。请记住,JSON只是文本,但一旦进入JavaScript(或PHP)对象,就应该进行适当的集合搜索:

var ar = ["a", "b", "c"]
var i = ar.indexOf("b")  // -> 1
var b = ar[i]  
alert(b)                 // -> "b"

请注意,这是在ECMAScript第5版中引入的。我建议对较旧的浏览器使用正则表达式。

虽然它不是最佳的,但您可以将元素存储在字符串中并使用正则表达式,如下所示:

var src='joe,fred,bob,zebulon';

function hasMember(src,name){
    var RE=new RegExp('(?:^|,)'+name+'(?:,|$)');
    return RE.test(src);
}

src.split(',').forEach(function(name){
   console.log(name+':'+hasMember(src,name));
});
其中打印:

joe:true
fred:true
bob:true
zebulon:true
对于console.log('rob:'+hassmember(src,'rob'))打印:


你说不能使用JS数组搜索功能是什么意思
myObj.friends.indexOf('joe')==1
Array.prototype.indexOf
array\u search
?什么意思,“不能使用JavaScript或php数组搜索函数”?你当然可以。编辑ha-ha-wowalso,调查“jsonpath”-它非常适合遍历JS对象,比什么好?我没有看到任何搜索或访问数组的尝试。感谢您的澄清。我倾向于同意这一点,这就是我一直以来存储/利用数据的方式。我最初提出这个问题是因为我无法找到合适的文档来确定这是否是最佳实践。@r3mus实践就是实践,而最佳实践是其中一个可能的灰色区域;-)我建议尽可能保持它的简单、干净和明确的意图——除非有理由这样做;让[经过验证的]理由决定实际实施。让整洁的代码变得凌乱比清理/修复凌乱要容易得多,尽管这令人心碎:D@r3mus也就是说,我个人会返回
朋友:[{name:..},{name:..}]
(但仍然是一个朋友数组),因为它更易于扩展-如果以后需要id或“昵称”呢?即使不在这里,也许在另一个问题?当使用像KO/AngularJS等厚客户端MVC/MVVM时,保持一个公共模式真的很有帮助,因为它可以导致对称和统一的客户端OM;感谢您的详细回复!如果有些数据有逗号呢?这就是为什么上帝给了我们JSON…当然,但OP正在寻找替代方案。