如何按值在 JS 集合中查找对象

How to find an object within a JS collection by value

我现在正在使用 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

它返回未定义。我不确定是否有其他方式获取信息?

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

更新

这是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))

另一种方法是使用 Javascript built-in 函数 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; }

这里有几点混淆。

_.where return一个数组:

Looks through each value in the list, returning an array of all the values that contain all of the key-value pairs listed in properties.

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

Looks through the list and returns the first value that matches all of the key-value pairs listed in properties.

其次,您的 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 (or Array.prototype.filter)并编写您自己的回调,但您已经可以使用 Underscore 了,何必呢?此外,Backbone 集合有 findWherewhere 方法,匹配 Backbone 的整体术语有优势。