从数组中提取ID

时间:2016-11-10 23:13:06

标签: javascript arrays

我有一个包含不同长度的数组的数组。这些数组包含带有一些id的对象,如下所示:

[
    [{
        docID: 'EP/L007177/1',
        weight: 0.60196078431373
    }, {
        //...
    }, 
    //...
    ], 
    [{
        //...
    }],
    // ...
]

然后我每次都有另一个包含一些ID的数组。

另一个数组的示例:

docs:[ { ID: 'AS/P003/5' }, { ID: 'EP/L007177/1'} ,......]

如何提取原始数组中包含我在另一个数组中的ID的(唯一)索引号?

我创建了这个功能,但如果我只给它一个ID,它确实可以正常工作:

var getTopics = function (Ids, Data) {
    var indexes = [];
    Data.forEach(function(d, i) {
        d.forEach(function(f) {             
            if ((Ids.indexOf(f.docID) > -1) && (indexes.indexOf(i) === -1)) {
                indexes.push(i);
            }                   
        });
    });
    return indexes;
}

如果我这样做:

docs.forEach(function(o) {
    list = gettopics(o.ID,Dataa) 
}) 

我只得到一个索引,这不是我所期望的。

2 个答案:

答案 0 :(得分:0)

据我所知,你想在嵌套数组中找到Object by ID(你可以用它做任何你想做的事情)。

以下是如何执行此操作的示例:

var arr1 = [ 
  [{id: 1, data: 'xxx'}, {id: 2, data: 'yyy'}], 
  [{id: 3, data: 'zzz'}]];

function finById(id) {
  var result = null;
  arr1.forEach((row) => {
    row.forEach((doc) => {
       if(doc.id === id) result = doc;
    })
  })
  return result;
}

答案 1 :(得分:0)

您的功能会起作用(虽然它不是最佳的),但是您调用它的方式有问题:

docs.forEach(function(o){ list = gettopics(o.ID,Dataa) }) 

一些问题:

  • 存在拼写差异( getTopics 需要大写字母T, Dataa 可能 a 太多)
  • 您将一个简单值作为第一个参数传递给 getTopics ,而 getTopics 期望该参数的数组
  • getTopics 的返回值保存在变量 list 中,但您可以对 docs 中的每个项目执行此操作,因此您将覆盖每次都是前一个结果,所以只剩下最后一个结果。

相反,构建一个可以作为第一个参数传递给 getTopics 的数组。您可以使用以下表达式构建该数组:

docs.map(function(o){ return o.ID })

这将收集数组中 Docs 的所有 ID 值。现在将其作为第一个参数传递给 getTopics

var list = getTopics(docs.map(function(o){ return o.ID }), data);

现在 list 将包含您期望的结果,即 Data 中与 doc 中的 ID 值对应的索引

命名约定

使用首字母大写字母命名变量并不常见。这通常保留用于命名构造函数/类。

var getTopics = function (ids, data) {
    var indexes = [];
    data.forEach(function(d, i) {
        d.forEach(function(f) {
            if ((ids.indexOf(f.docID) > -1) && (indexes.indexOf(i) === -1)) {
                indexes.push(i);
            }
        });
    });
    return indexes;
}

var data = [
    [{
        docID: 'EP/L007177/1',
        weight: 0.602
    }, {
        docID: 'EP/L007177/2',
        weight: 0.939
    }, {
        docID: 'EP/L007177/3',
        weight: 0.511
    }],
    [{
        docID: 'AB/L007177/1',
        weight: 0.123
    }, {
        docID: 'AB/L007177/2',
        weight: 0.923
    }, {
        docID: 'AB/L007177/3',
        weight: 0.351
    }]
];

var docs = [
    {ID: 'EP/L007177/3'},
    {ID: 'AB/L007177/2'}
];

var result = getTopics(docs.map(function(o){ return o.ID }), data);

console.log(result);