映射对象数组,然后映射这些对象中的另一个数组并删除重复项

时间:2016-09-08 14:58:17

标签: javascript arrays lodash

我正在处理一个从API获取对象数组的函数,在这些对象中它们是一个标记数组,我想返回这些对象的所有标记以填充标记中的选择字段。这是我到目前为止所得到的,它开始变得有点混乱我正在做的所有地图,它也返回值,但它返回它们与原始对象数组相同的长度,并摆脱任何重复。我做错了什么,或者他们是更好的方法,我正在使用lodash?

BSTR val = SysAllocString(L"/VirtualBox/GuestInfo/Net/0/V4/IP");

HRESULT hr = machine->GetGuestPropertyValue(val, &ip);
if (SUCCEEDED(hr))
{
    wprintf(L"The machine's IP is: %s", ip);
}
else
    printf("Error retrieving machine IP! rc = 0x%x\n", hr);

SysFreeString(val);

2 个答案:

答案 0 :(得分:1)

使用reduce我使代码更简洁,JS Bin上有一个可用的版本。你必须调整它以放入你的框架(它是React吗?)。

一个好的建议是寻找lodash方法的返回类型。 方法reduce返回一个数组,这意味着我们不需要创建一个临时数组来保存我们的值,并直接分配给tags_array

// assuming your data is something like this...
var objects = [
  {
    name: 'a',
    tags: ['a', 'b', 'c']
  },
  {
    name: 'b',
    tags: ['b', 'c', 'd']
  },
  {
    name: 'c',
    tags: ['a', 'c', 'd', 'e']
  }
]


var tags_array = _.uniq(                // returns a unique array.
  _.reduce(objects, function(i, o){     // iterates through objects and
    return o.tags;                      // returns o.tags each time
  })
);

console.log(tags_array);
// #=> ["a", "c", "d", "e"] 

所以你的功能可能会像这样,我猜:

renderOptions(){
    let dataRef = this.props.designs.items;
    var tags_array = _.uniq(                // returns unique.
      _.reduce(dataRef, function(i, o){     // iterates through objects and
        return o.tags;                      // returns o.tags each time
      })
    );
    return tags_array;
 }

然后你可以在你的视图中遍历数组,或者调整renderOptions函数来返回li html元素。

reduce方法也可以用作下面提到的Palermo

let tags_array = objects.reduce((i, o) => { return o.tags; });

所以不需要lodash。

答案 1 :(得分:0)

你甚至不需要lodash这样做。这是一种更清洁的方法

let tags_array = dataRef.reduce((i, o) => { return o.tags; });