使用来自另一个子数组的值填充数组

时间:2017-06-19 18:32:28

标签: javascript jquery arrays json underscore.js

假设我有这样的json结果:

{
  "results": [{
      "id": 1, "name": "test1"
    },
    {
      "id": 2, "name": "test2",
      "tags": [{"name": "car"},{ "name": "love"}]
    },
    {
      "id": 3, "name": "test3",
      "tags": [{"name": "car"},{"name": "bike"},{"name": "motorcycle"}]
    }
  ]
}

我想只使用唯一标签装载一个新阵列,在这个例子中将是汽车,爱情,自行车,摩托车。

有时标签为空或空......

如果没有循环,有没有办法做到这一点? jquery或下划线适合这个?可以使用纯javascript完成吗?

欢呼声

2 个答案:

答案 0 :(得分:1)

const tagSet = new Set (                      // use ES6 set to get rid of duplicates
    obj.results
       .filter(r => r.hasOwnProperty('tags')) // check for tags property
       .map(r => r.tags)                      // extract array of array of tag obj
       .reduce((a, b) => a.concat(b), [])     // flatten into array of obj
       .map(flat => flat.name)                // extract name property
);
const uniques = [...tagSet];                  // convert back into array

console.log(uniques); // [ 'car', 'love', 'bike', 'motorcycle' ]

答案 1 :(得分:1)

由于您询问underscore,我将为您提供lodash解决方案(因为lodash已有效替换了下划线)。您可以使用lodash使用内置方法的功能方法来实现此目的,如下所示:

  • _。flatMap() - 将对象内的值按属性抓取到单个数组中并展平任何嵌套数组

  • _。compact() - 删除所有falsenull0""undefined和{{1} }

  • _。map() - 与上面相同,没有展平(不需要在这里)

  • _。uniq() - 仅返回唯一值



NaN

var data = {
  "results": [{
      "id": 1, "name": "test1"
    },
    {
      "id": 2, "name": "test2",
      "tags": [{"name": "car"},{ "name": "love"}]
    },
    {
      "id": 3, "name": "test3",
      "tags": [{"name": "car"},{"name": "bike"},{"name": "motorcycle"}]
    }
  ]
};

var uniq = _.uniq(_.map(_.compact(_.flatMap(data.results, "tags")), "name"));
console.log(uniq);




或者,您可以使用<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>链接语句,而不是嵌套它们(出于可读性目的),如下所示:

_.chain()
相关问题