如何通过值

时间:2018-03-21 12:28:15

标签: javascript backbone.js underscore.js

我正在使用API​​,我正在使用details[5].Value以下列格式定位信息:

details:
    "value":[
        { 
            "ID": "6",
            "Name": "Links",
            "Value": "URL"
        },
        { 
            "ID": "7",
            "Name": "Other",
            "Value": "URL"
        }
        etc
    ]

问题是JSON响应中的位置可能会在将来发生变化,使我的代码过时,并且由于url也有可能发生变化,我无法将其作为目标。

我想要一种方法来定位url的值,主要是因为这个,"Name"属性的值。但是,如果我使用像

这样的东西
_.where(details, { Name: "Links" }).Value

它以未定义的形式返回。我不确定是否会有其他方法来获取信息?

3 个答案:

答案 0 :(得分:2)

这里有几点混淆。

_.where返回一个数组:

  

查看列表中的每个值,返回包含属性中列出的所有键值对的所有值的数组。

所以你的_.where(details, obj).Value(几乎)总是会给你undefined,因为数组不太可能有Value属性。另一方面,_.findWhere确实返回一个值:

  

浏览列表并返回与属性中列出的所有键值对匹配的第一个值。

其次,您的details似乎如下:

let details = {
    value: [
        { ID: '6', Name: 'Links', Value: 'URL' },
        { ID: '7', Name: 'Other', Value: 'URL' },
        ...
    ]
}

因此您不想搜索details,而是想搜索details.value

将它们放在一起:

_(details.value).findWhere({ Name: 'Links' }).Value

_.findWhere(details.value, { Name: 'Links' }).Value

您可以使用Array.prototype.find(或Array.prototype.filter如果您要查找所有匹配项)并编写自己的回调但您已经拥有可用的Underscore,那么为什么要这么麻烦?此外,Backbone集合具有findWherewhere方法,并且匹配Backbone的整体术语具有优势。

答案 1 :(得分:0)

看看这个迷你功能。如果出现问题,请告诉我

更新

这是ES5版本

function f(key, value, array){
    return array.value.filter(function(sub_array){
        return sub_array[key] == value;
    });
}

这是ES6高尔夫版本

f=(k,v,a)=>a.value.filter(_=>_[k]==v)



//This is your JSON 
var details = {
  value: [
    {
      "ID": "6",
      "Name": "Links",
      "Value": "URL"
    },
    {
      "ID": "7",
      "Name": "Other",
      "Value": "URL"
    }
  ]
}

// Short code
f=(k,v,a)=>a.value.filter(_=>_[k]==v)

// f is the function name
// Recives k = array key, v = value, a = array
// filter by the given key and value
// return the result as an array

console.log(f('Name', 'Links', details))




答案 2 :(得分:0)

另一种方法是使用Javascript内置函数 find 来获取数组中的特定对象。

  • 此替代方法允许您传递对象或字符串。
  • 如果byThis参数是一个对象,则整个key-values集必须与目标数组中每个对象的key-values匹配。
  • 否则,如果byThis是一个字符串,则每个对象都将被视为字符串以进行必要的比较。

let details = {  "value": [{    "ID": "6",    "Name": "Links",    "Value": "URL"  }, {    "ID": "7",    "Name": "Other",    "Value": "URL"  }]};

let findBy = (array, byThis) => {
  return array.find(o => {
    if (typeof byThis === 'object') return Object.keys(byThis).every(k => o[k] === byThis[k]);
    else if (typeof byThis === 'string') return o.toString() ===  byThis;
  });
}

let found = findBy(details.value, {Name: "Links"});

console.log(found);
.as-console-wrapper { max-height: 100% !important; top: 0; }