javascript - 从键以特定模式结尾的对象中获取所有值

标签 javascript jquery arrays object

我正在尝试从对象中检索所有键值,其中键名称以(比如 _abc)结尾。

我的尝试

obj = {p1_abc: 1, p2_abc: 2, p3_def: 3, p4_abc: 4, p5_def: 5}

required_keys = jQuery.map(Object.keys(obj), function(val, i){
  if(val.indexOf("_abc") != -1)
    return val;
});
//required_keys = ['p1_abc', 'p2_abc', 'p4_abc']

required_values = jQuery.map(required_keys, function(v, i){
  return(obj[v]);
});
//required_values = [1, 2, 4]

这里,required_values 包含我需要的值,但我觉得整个代码有点难看。有没有一种干净的方法可以实现这一点?

最佳答案

有几分钟的空闲时间,这似乎是一个很好的问题来介绍iterators

以下是一个用 ES5 编写的示例,但它也可以在加载垫片的 ES3 中工作。

function makeEntriesIterator(object) {
  var keys = Object.keys(object);
  var nextKey = 0;
  return {
    next: function next() {
      if (nextKey < keys.length) {
        var key = keys[nextKey];
        var iterator = {
          value: [key, object[key]],
          done: false
        };
        nextKey += 1;
        return iterator;
      }
      return {
        value: undefined,
        done: true
      };
    }
  };
}

var obj = {
  p1_abc: 1,
  p2_abc: 2,
  p3_def: 3,
  p4_abc: 4,
  p5_def: 5
};

var iterator = makeEntriesIterator(obj);
var next = iterator.next();
var matches = [];
while (!next.done) {
  if (next.value[0].slice(-4) === '_abc') {
    matches.push(next.value);
  }
  next = iterator.next();
}
document.getElementById('out').textContent = JSON.stringify(matches, null, 2);
console.log(matches);
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.4.1/es5-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>

<pre id="out"></pre>

在 ES6 中,你可以使用 for..of而不是 while和数组有迭代器 values , entrieskeys , 默认 Symbol.iterator

'use strict';

const obj = {
  p1_abc: 1,
  p2_abc: 2,
  p3_def: 3,
  p4_abc: 4,
  p5_def: 5
};

const matches = [];
for (let key of Object.keys(obj)) {
  if (key.endsWith('_abc')) {
    matches.push([key, obj[key]]);
  }
}
document.getElementById('out').textContent = JSON.stringify(matches, null, 2);
console.log(matches);
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.4.1/es5-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.34.0/es6-shim.js"></script>
<pre id="out"></pre>

ES7将为对象引入迭代器,例如entries然后事情变得更加清晰,因为您将不需要使用 Object.keys。但是现在还不能证明这一点。

'use strict';

const obj = {
  p1_abc: 1,
  p2_abc: 2,
  p3_def: 3,
  p4_abc: 4,
  p5_def: 5
};

const matches = [];
for (let [key, value] of obj) {
  if (key.endsWith('_abc')) {
    matches.push([key, value]);
  }
}

关于javascript - 从键以特定模式结尾的对象中获取所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34488829/

相关文章:

android - Onlistitemclick 不起作用

javascript - 如何在 javascript 中指定类型

javascript - 无法使用 Renderer2 更改使用 ViewChild 引用的按钮的属性

jquery - 是否可以在没有媒体查询、视口(viewport)和其他脚本的情况下使网站适合 iPad/iPhone?

jquery - Facebook 页面插件仅显示带有页面名称的文本

c - getchar() 不断读取 '\n' 。到底是怎么回事?

javascript - 使用原型(prototype)创建数组,其方法实现数组原型(prototype)的包装器

javascript - 过滤 ng-options 时,如何取消选择所有过滤掉的选项?

javascript - 使 XUL 对话框窗口在不适合屏幕时显示滚动

ajax - 我可以使用 jQuery AJAX 将图像从另一个域发布到我的 Rails 应用程序吗?